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.trace
,O,\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 描述了允许的标志字符。无法识别的标志字符将被静默忽略。
Flag | Description |
---|---|
d | 为当前状态启用来自 DBUG_ * XXX *宏的输出。可能紧随其后的是关键字列 table,该列 table 仅对具有该关键字的 DBUG 宏启用输出。关键字列 table 为空时,将启用所有宏的输出。 |
在 MySQL 中,要启用的常见调试宏关键字为enter
,exit
,error
,warning
,info
和loop
。
| D
|每条调试器输出行之后的延迟。参数是延迟(以十分之一秒为单位),取决于机器的功能。例如,D,20
指定 2 秒的延迟。
| f
|将调试,跟踪和性能分析限制为命名函数的列 table。空列 table 将启用所有功能。仍然必须提供适当的d
或t
标志; |如果启用了此标志,则仅限制其动作。
| 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 用于标记字符,例如d
或f
,它们可以为所有适用的修饰符或其中一些修饰符启用调试操作:
-
在没有前导
+
或-
的情况下,标志值将完全设置为给定的修饰符列 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 |
+---------+
| |
+---------+