MySQL DBUG源码框架使用方法

举报
GaussDB数据库 发表于 2019/04/22 15:14:34 2019/04/22
【摘要】 DBUG简介: DBUG作为一套用于嵌入代码中帮助调试的库,能够有效帮助我们寻找函数的调用关系,而MYSQL也使用了该框架,在原生的代码基础上添加了一些更改,增加了一些功能,但基础使用方法未改变。而在这里,我们仅介绍原生工具的使用方法。 DBUG需要先调用DBUG_PUSH方法设置参数,之后调用DBUG_PROCESS设置进程名称,在完成设置后,在需要进行追踪的函数中调用DB...

DBUG简介:

DBUG作为一套用于嵌入代码中帮助调试的库,能够有效帮助我们寻找函数的调用关系,而MYSQL也使用了该框架,在原生的代码基础上添加了一些更改,增加了一些功能,但基础使用方法未改变。而在这里,我们仅介绍原生工具的使用方法。


DBUG
需要先调用DBUG_PUSH方法设置参数,之后调用DBUG_PROCESS设置进程名称,在完成设置后,在需要进行追踪的函数中调用DBUG_ENTER,同时需要在结束函数调用时执行DBUG_RETURN结束追踪,在函数调用过程中使用DBUG_PRINT就可以输出信息。例子如下:

 

-cpp代码

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_IFkeyword, a1 原生的DBUG_EXECUTE功能.

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。