文档首页
MySQL 8.4 参考手册
相关文档 下载本手册

7.9.4 DBUG 包

MySQL 服务器和大多数 MySQL 客户端都编译了最初由 Fred Fish 创建的 DBUG 包。当您将 MySQL 配置为调试模式时,此包可以获取程序正在执行的操作的跟踪文件。请参阅 第 7.9.1.2 节,“创建跟踪文件”

本节概述了您可以在已构建调试支持的 MySQL 程序的命令行调试选项中指定的参数值。

可以通过使用 --debug[=debug_options]-# [debug_options] 选项调用程序来使用 DBUG 包。如果在没有指定 debug_options 值的情况下指定了 --debug-# 选项,则大多数 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:设置调试输出文件。

大多数客户端程序都使用默认的 debug_optionsd: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 值需要足以设置受限会话系统变量的权限。请参阅 第 7.1.9.1 节,“系统变量权限”

debug_options 值是由冒号分隔的字段序列

field_1:field_2:...:field_N

值中的每个字段都包含一个强制标志字符,可选地在前面加上一个 +- 字符,可选地在后面跟上一个逗号分隔的修饰符列表

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

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

标志

描述

d

为当前状态启用 DBUG_XXX 宏的输出。后面可以跟一个关键字列表,这将仅为具有该关键字的 DBUG 宏启用输出。空关键字列表将为所有宏启用输出。

在 MySQL 中,要启用的常见调试宏关键字包括 enterexiterrorwarninginfoloop

D

每个调试器输出行之后的延迟。参数是延迟时间(以十分之一秒为单位),具体取决于机器的功能。例如,D,20 指定两秒的延迟。

f

将调试、跟踪和分析限制为指定的函数列表。空列表将启用所有函数。仍然必须给出相应的 dt 标志;此标志仅在启用时限制其操作。

F

为每行调试或跟踪输出标识源文件名。

i

为每行调试或跟踪输出标识带有 PID 或线程 ID 的进程。

L

为每行调试或跟踪输出标识源文件行号。

n

为每行调试或跟踪输出打印当前函数嵌套深度。

N

为每行调试输出编号。

o

将调试器输出流重定向到指定的文件。默认输出为 stderr

O

o 类似,但在每次写入之间都会真正刷新文件。必要时,将在每次写入之间关闭并重新打开文件。

a

o 类似,但以追加模式打开。

A

O 类似,但以追加模式打开。

p

将调试器操作限制为指定的进程。必须使用 DBUG_PROCESS 宏标识进程,并且与列表中的一个进程匹配才能执行调试器操作。

P

为每行调试或跟踪输出打印当前进程名称。

r

推送新状态时,不要继承先前状态的函数嵌套级别。当输出要从左边缘开始时非常有用。

t

启用函数调用/退出跟踪行。后面可以跟一个列表(仅包含一个修饰符),给出最大跟踪级别,超过此级别,调试或跟踪宏都不会输出任何内容。默认值是编译时选项。

T

为每一行输出打印当前时间戳。

前导 +- 字符和尾随的修饰符列表用于标志字符,例如 df,它们可以为所有适用的修饰符或其中一些修饰符启用调试操作。

  • 如果没有前导 +-,则标志值将设置为与给定的修饰符列表完全相同。

  • 使用前导 +-,列表中的修饰符将添加到当前修饰符列表中或从当前修饰符列表中减去。

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

这些语句将 d 值设置为给定的修饰符列表。

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

前导 +- 将添加到当前 d 值或从当前 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 |
+---------+
|         |
+---------+