MySQL DBUG源码框架使用方法
DBUG简介:
DBUG作为一套用于嵌入代码中帮助调试的库,能够有效帮助我们寻找函数的调用关系,而MYSQL也使用了该框架,在原生的代码基础上添加了一些更改,增加了一些功能,但基础使用方法未改变。而在这里,我们仅介绍原生工具的使用方法。
DBUG需要先调用DBUG_PUSH方法设置参数,之后调用DBUG_PROCESS设置进程名称,在完成设置后,在需要进行追踪的函数中调用DBUG_ENTER,同时需要在结束函数调用时执行DBUG_RETURN结束追踪,在函数调用过程中使用DBUG_PRINT就可以输出信息。例子如下:
01 | #include "dbug.h" | |
02 |
03 | int sub1 (void); | |
04 | void sub2 (char *arg); |
05 | ||
06 | int |
07 | sub1 (void) | |
08 | { |
09 | DBUG_ENTER ("sub1"); | |
10 | DBUG_PRINT ("info", ("Got argument")); |
11 | sub2 ("Hello world!"); |
12 | sub2 ("Hello earth!"); |
13 | sub2 ("Hello programmer!"); | |
14 |
15 | DBUG_RETURN (0); | |
16 | } |
17 | |
18 |
19 | void | |
20 | sub2 (char *arg) |
21 | { | |
22 | DBUG_PUSH ("L:D,20:d:t:0:i:P:t:F:n:p,example2"); |
23 | DBUG_PROCESS ("example2"); | |
24 | DBUG_ENTER ("sub2"); |
25 | DBUG_PRINT ("info", ("Got argument: '%s'", arg)); | |
26 |
27 | printf ("%s\n", arg); | |
28 | DBUG_PRINT ("error", ("Got argument: '%s'", arg)); |
29 | DBUG_VOID_RETURN; | |
30 | } |
31 | |
32 |
33 | int | |
34 | main (void) |
35 | { | |
36 | int ret = 0; |
37 | DBUG_PUSH ("D,10:t:0:i:P:t:F:n:p,example"); | |
38 | DBUG_PROCESS ("example"); |
39 | ||
40 | ret = sub1 (); |
41 | DBUG_PRINT ("info", ("Returned value: %d", ret)); | |
42 |
43 | return 0; | |
44 | } |
3. DBUG参数作用
标志 | 说明 |
d | 输出 DBUG_XXX 调试宏。可以添加宏关键字到修饰符列表,空修饰符列表则输出所有调试宏。 在 MySQL 中,常用调试宏关键字有:enter exit error warning info loop 当含有参数时只输出该输出,不添加该参数不输出debugprint的内容 |
D | 延迟每一行的跟踪输出。参数表示为 1/10 秒,取决于机器的性能。 例如:D,20 表示延迟 2 秒输出 |
f | 仅调试、跟踪、分析修饰符列表中的函数,空修饰符列表则跟踪所有函数。 需要设置适当的 d 或 f 标志,如果它们可用,那么 f 标志将只限制 d、f 的操作,如f,sub1就是指追踪sub1函数 |
F | 识别每一行跟踪输出的源码文件名 有时会出错,显示函数名,与t搭配使用 |
i | 识别每一行跟踪输出的进程号(已验证) 或线程 ID(暂未验证) |
L | 识别每一行跟踪输出的源码文件行号 |
n | 打印每一行跟踪输出的当前函数的嵌套深度 |
N | 为每一行跟踪输出编号 |
o | 重定向输出到指定文件。默认输出到 stderr。当指定文件时,本地不输出。 |
O | 类似 o 标志,但在文件每次写入之前都会被刷新。必要时,文件会先关闭之后再打开写入。 |
p | 限制调试器只对指定进程生效。该进程必须使用 DBUG_PROCESS 宏标识,并且匹配调试器操作列表中的一项。 |
P | 打印每一行跟踪输出的当前进程名 |
r | 当推出一个新的状态时,不继承前一个状态的函数嵌套级别。 当跟踪信息在左边留空一段之后才输出时,有用。 |
S | 让每个调试过的函数执行 _sanity(_file_,_line_) 函数直到 _sanity() 的返回值不等于 0 为止。(多数情况与 safemalloc 一起用排查内存问题)。 |
t | 打印函数调用/退出的跟踪输出行。 可以指定一个最大跟踪级别(此标志仅有一个修饰符),超出此级别的调试宏将不再被输出。 默认值为一个编译时间选项。 |
4. DBUG各函数作用
DBUG_PUSH(a1):设置参数,参数之间用:隔开
DBUG_POP:清除参数
DBUG_PROCESS(a1):设置进程名称a1
DBUG_ASSERT(A):调用assert(A)使程序crash
DBUG_EXECUTE (keyword,a1):根据参数中是否含有keyword判断是否执行对应的a1语句。修饰符可以通过DEBUG_PUSH(d,xxx)设置。
DBUG_LEAVE:退出该调试进程。
DBUG_RETURN(a1):在调用DBUG_LEAVE后返回a1。
DBUG_PRINT(keyword,arglist) 根据参数中修饰符列表中是否含有keyword判断是否输出a1语句。修饰符可以通过DEBUG_PUSH(d,xxx)设置。
Mysql新增:
DBUG_SET(a1):更新列表上的设置参数。可用+,-控制,例如DBUG_SET("+d,never")\可以添加d,never参数,DBUG_SET("d,never")重置参数,DBUG_SET("-d,never")删除该参数。
DBUG_SET_INITIAL(a1)重新设置参数
DBUG_EXPLAIN(buf, len) 将参数列表输入至char *buf中
DBUG_LOCK_FILE 对输出的trace文件加锁
DBUG_UNLOCK_FILE 对输出的trace文件解锁
DBUG_END() 结束调试,清空堆栈
DBUG_ASSERT(A) assert(A)
DBUG_EXECUTE_IF(keyword, a1) 原生的DBUG_EXECUTE功能.
- 点赞
- 收藏
- 关注作者
评论(0)