### 5.9.4 DBUG 包

[](<>)

MySQL 服务器和大多数 MySQL 客户端是使用最初由 Fred Fish 创建的 DBUG 包编译的。当您配置 MySQL 进行调试时，此包可以获取程序正在执行的跟踪文件。看[第 5.9.1.2 节，“创建跟踪文件”](making-trace-files.html).

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

DBUG 包可以通过调用程序来使用`--调试[=*`调试选项`*]`要么`-# [*`调试选项`*]`选项。如果您指定`--调试`要么`-#`没有选项*`调试选项`*值，大多数 MySQL 程序使用默认值。服务器默认是`d:t:i:o,/tmp/mysqld.trace`在 Unix 和`d:t:i:O,\mysqld.trace`在 Windows 上。此默认值的效果是：

-   `d`: 启用所有调试宏的输出

-   `吨`: 跟踪函数调用和退出

-   `一世`: 将 PID 添加到输出行

-   `o,/tmp/mysqld.trace`,`O,\mysqld.trace`：设置调试输出文件。

    大多数客户端程序使用默认值*`调试选项`*的价值`d:t:o,/tmp/*`程序名`*。痕迹`，无论平台如何。

    以下是一些示例调试控制字符串，因为它们可能在 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**](mysqld.html)，也可以通过设置在运行时更改 DBUG 设置[`调试`](server-system-variables.html#sysvar_debug)系统变量。此变量具有全局值和会话值：

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

改变全球[`调试`](server-system-variables.html#sysvar_debug)value 需要足够的权限来设置全局系统变量。更改会话[`调试`](server-system-variables.html#sysvar_debug)value 需要足够的权限来设置受限会话系统变量。看[第 5.1.9.1 节，“系统变量权限”](system-variable-privileges.html).

这*`调试选项`*value 是一系列以冒号分隔的字段：

```
field_1:field_2:...:field_N
```

值中的每个字段都包含一个强制标志字符，前面可选`+`要么`-`字符，并且可以选择后跟以逗号分隔的修饰符列表：

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

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

| 旗帜 | 描述 |
| --- | --- |
| `d` | 启用 DBUG 的输出\_*`XXX`*当前状态的宏。后面可能是一个关键字列表，它只为带有该关键字的 DBUG 宏启用输出。关键字的空列表启用所有宏的输出。<br/><br/>在 MySQL 中，要启用的常用调试宏关键字是`进入`,`出口`,`错误`,`警告`,`信息`， 和`环形`. |
| `D` | 每个调试器输出线后的延迟。参数是延迟，以十分之一秒为单位，取决于机器的能力。例如，`D,20`指定两秒的延迟。 |
| `f` | 将调试、跟踪和分析限制在命名函数列表中。空列表启用所有功能。适当的`d`要么`吨`仍然必须给予旗帜；此标志仅在启用时限制其操作。 |
| `F` | 确定每一行调试或跟踪输出的源文件名。 |
| `一世` | 使用 PID 或线程 ID 识别每行调试或跟踪输出的进程。 |
| `大号` | 确定每行调试或跟踪输出的源文件行号。 |
| `n` | 打印每行调试或跟踪输出的当前函数嵌套深度。 |
| `ñ` | 为调试输出的每一行编号。 |
| `○` | 将调试器输出流重定向到指定文件。默认输出是`标准错误`. |
| `○` | 喜欢`○`，但文件在每次写入之间确实被刷新。需要时，文件会在每次写入之间关闭并重新打开。 |
| `p` | 将调试器操作限制为指定进程。一个过程必须与`DBUG_PROCESS`宏并匹配列表中的一个以进行调试器操作。 |
| `磷` | 打印每行调试或跟踪输出的当前进程名称。 |
| `r` | 推送新状态时，不要继承前一个状态的函数嵌套级别。当输出从左边距开始时很有用。 |
| `小号` | 做功能`_sanity(_file_,_line_)`在每个调试的功能，直到`_sanity()`返回不同于 0 的值。 |
| `吨` | 启用函数调用/退出跟踪行。后面可能是一个列表（仅包含一个修饰符），给出了数字最大跟踪级别，超过该级别后，调试或跟踪宏都不会出现输出。默认值为编译时选项。 |

领先的`+`要么`-`修饰符的字符和尾随列表用于标志字符，例如`d`要么`f`可以为所有适用的修饰符或其中一些修饰符启用调试操作：

-   没有领先`+`要么`-`，标志值被设置为给定的修饰符列表。

-   以领先的`+`要么`-`，列表中的修饰符被添加到当前修饰符列表中或从当前修饰符列表中减去。

    下面的例子展示了它是如何工作的`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`价值：

```
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 |
+---------+
|         |
+---------+
```
