28.5.3 DBUG 软件包

MySQL 服务器和大多数 MySQLClient 端使用最初由 Fred Fish 创建的 DBUG 包进行编译。当您配置了 MySQL 进行调试后,该软件包可以获取程序正在执行的跟踪文件。参见第 28.5.1.2 节“创建跟踪文件”

本节总结了您可以在命令行的调试选项中为使用调试支持构建的 MySQL 程序指定的参数值。

可以通过使用--debug[=debug_options]-# [debug_options]选项调用程序来使用 DBUG 软件包。如果您指定的--debug-#选项不带* debug_options *值,则大多数 MySQL 程序都使用默认值。服务器默认在 Unix 上是d:t:i:o,/tmp/mysqld.trace,在 Windows 上是d:t:i:O,\mysqld.trace。此默认设置的效果是:

  • d:为所有调试宏启用输出

  • t:跟踪函数调用和退出

  • i:将 PID 添加到输出行

  • o,/tmp/mysqld.traceO,\mysqld.trace:设置调试输出文件。

不论平台如何,大多数 Client 端程序都使用默认值debug_options * d:t:o,/tmp/program_name.trace

以下是一些示例调试控制字符串,它们可能在 Shell 命令行上指定:

--debug=d:t
--debug=d:f,main,subr1:F:L:t,20
--debug=d,input,output,files:n
--debug=d:t:i:O,\\mysqld.trace

对于mysqld,还可以通过设置debug系统变量在运行时更改 DBUG 设置。此变量具有全局值和会话值:

mysql> SET GLOBAL debug = 'debug_options';
mysql> SET SESSION debug = 'debug_options';

更改全局debug值需要足够的特权来设置全局系统变量。更改会话debug的值要求特权足以设置受限制的会话系统变量。参见第 5.1.8.1 节“系统变量特权”

  • debug_options *值是由冒号分隔的字段的序列:
field_1:field_2:...:field_N

值中的每个字段都包含一个强制性标志字符,可以选择在其前面加上+-字符,并可以选择在其后跟随一个逗号分隔的修饰符列 table:

[+|-]flag[,modifier,modifier,...,modifier]

下 table 描述了允许的标志字符。无法识别的标志字符将被静默忽略。

FlagDescription
d为当前状态启用来自 DBUG_ * XXX *宏的输出。可能紧随其后的是关键字列 table,该列 table 仅对具有该关键字的 DBUG 宏启用输出。关键字列 table 为空时,将启用所有宏的输出。


在 MySQL 中,要启用的常见调试宏关键字为enterexiterrorwarninginfoloop
| D |每条调试器输出行之后的延迟。参数是延迟(以十分之一秒为单位),取决于机器的功能。例如,D,20指定 2 秒的延迟。
| f |将调试,跟踪和性能分析限制为命名函数的列 table。空列 table 将启用所有功能。仍然必须提供适当的dt标志; |如果启用了此标志,则仅限制其动作。
| F |标识调试或跟踪输出的每一行的源文件名。
| i |用调试或跟踪输出的每一行的 PID 或线程 ID 标识进程。
| L |标识调试或跟踪输出的每一行的源文件行号。
| n |为调试或跟踪输出的每一行打印当前函数的嵌套深度。
| N |为调试输出的每一行编号。
| o |将调试器输出流重定向到指定文件。默认输出为stderr
| O |类似于o,但是每次写入之间确实刷新了文件。需要时,在每次写入之间关闭并重新打开文件。
| p |将调试器操作限制为指定的进程。必须使用DBUG_PROCESS宏标识一个进程,并且该进程必须与列 table 中的一个相匹配才能发生调试器动作。
| P |为调试或跟踪输出的每一行打印当前进程名称。
| r |推入新状态时,请勿继承前一状态的功能嵌套级别。当输出从左边距开始时很有用。
| | S |在每个调试的函数上执行函数_sanity(_file_,_line_),直到_sanity()返回的值不同于 0.
| t |启用函数调用/退出跟踪线。可能紧随其后的是一个列 table(仅包含一个修饰符),该列 table 给出了数字最大跟踪级别,超过该级别时,调试或跟踪宏都不会输出。默认为编译时选项。

开头的+-字符和修饰符的尾随列 table 用于标记字符,例如df,它们可以为所有适用的修饰符或其中一些修饰符启用调试操作:

  • 在没有前导+-的情况下,标志值将完全设置为给定的修饰符列 table。

  • 对于前导+-,列 table 中的修饰符将添加到当前修饰符列 table 中或从当前修饰符列 table 中减去。

以下示例显示了d标志的工作方式。空的d列 table 启用了所有调试宏的输出。非空列 table 仅对列 table 中的宏关键字启用输出。

这些语句将d值设置为修饰符列 table,如下所示:

mysql> SET debug = 'd';
mysql> SELECT @@debug;
+---------+
| @@debug |
+---------+
| d       |
+---------+
mysql> SET debug = 'd,error,warning';
mysql> SELECT @@debug;
+-----------------+
| @@debug         |
+-----------------+
| d,error,warning |
+-----------------+

前导+-与当前d值相加或相减:

mysql> SET debug = '+d,loop';
mysql> SELECT @@debug;
+----------------------+
| @@debug              |
+----------------------+
| d,error,warning,loop |
+----------------------+
mysql> SET debug = '-d,error,loop';
mysql> SELECT @@debug;
+-----------+
| @@debug   |
+-----------+
| d,warning |
+-----------+

添加到“所有宏已启用”不会导致更改:

mysql> SET debug = 'd';
mysql> SELECT @@debug;
+---------+
| @@debug |
+---------+
| d       |
+---------+
mysql> SET debug = '+d,loop';
mysql> SELECT @@debug;
+---------+
| @@debug |
+---------+
| d       |
+---------+

禁用所有启用的宏将完全禁用d标志:

mysql> SET debug = 'd,error,loop';
mysql> SELECT @@debug;
+--------------+
| @@debug      |
+--------------+
| d,error,loop |
+--------------+
mysql> SET debug = '-d,error,loop';
mysql> SELECT @@debug;
+---------+
| @@debug |
+---------+
|         |
+---------+