#### 5.9.1.4 gdb下调试mysqld

[](<>)

在大多数系统上，您也可以启动[**mysqld**](mysqld.html)从**数据库**获取更多信息，如果[**mysqld**](mysqld.html)崩溃。

与一些年长的**数据库**您必须使用的 Linux 版本`运行--一个线程`如果你想能够调试[**mysqld**](mysqld.html)线程。在这种情况下，您一次只能激活一个线程。

NPTL 线程（Linux 上的新线程库）在运行时可能会导致问题[**mysqld**](mysqld.html)在下面**数据库**.一些症状是：

-   [**mysqld**](mysqld.html)在启动期间挂起（在它写入之前`准备连接`）。

-   [**mysqld**](mysqld.html)期间崩溃`pthread_mutex_lock()`要么`pthread_mutex_unlock()`称呼。

    在这种情况下，您应该在开始之前在 shell 中设置以下环境变量**数据库**：


```
LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL
```

跑步时[**mysqld**](mysqld.html)在下面**数据库**，你应该禁用堆栈跟踪[`--skip-stack-trace`](server-options.html#option_mysqld_skip-stack-trace)能够捕获内部的段错误**数据库**.

[](<>)

使用[`--gdb`](server-options.html#option_mysqld_gdb)选项[**mysqld**](mysqld.html)安装一个中断处理程序`信号情报`（需要停止[**mysqld**](mysqld.html)和`^C`设置断点）并禁用堆栈跟踪和核心文件处理。

在下面调试 MySQL 非常困难**gdb**如果你一直在做很多新的连接**gdb**不会释放旧线程的内存。你可以通过启动来避免这个问题[**mysqld**](mysqld.html)具有[`线程缓存大小`](server-system-variables.html#sysvar_thread_cache_size)设置为等于的值[`max_连接`](server-system-variables.html#sysvar_max_connections)+ 1. 在大多数情况下，仅仅使用[`--线程缓存大小=5'`](server-system-variables.html#sysvar_thread_cache_size)帮了大忙！

如果你想在Linux上获得内核转储，如果[**mysqld**](mysqld.html)如果SIGSEGV信号消失，你可以开始[**mysqld**](mysqld.html)和[`--核心文件`](server-options.html#option_mysqld_core-file)选项这个核心文件可以用来进行回溯，帮助你找出原因[**mysqld**](mysqld.html)死亡：

```
$> gdb mysqld core
gdb>   backtrace full
gdb>   quit
```

看见[B.3.3.3节，“如果MySQL持续崩溃，该怎么办”](crashing.html).

如果你正在使用**gdb**在Linux上，您应该安装`.gdb`文件，包含以下信息，位于当前目录中：

```
set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint
```

下面是一个如何调试的示例[**mysqld**](mysqld.html):

```
$> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Do this when mysqld crashes
```

在错误报告中包含前面的输出，您可以使用中的说明将其归档[第1.6节，“如何报告错误或问题”](bug-reports.html).

如果[**mysqld**](mysqld.html)挂起，你可以尝试使用一些系统工具，比如`斯特拉斯`或`/usr/proc/bin/pstack`检查一下在哪里[**mysqld**](mysqld.html)已经挂了。

```
strace /tmp/log libexec/mysqld
```

[](<>)[](<>)[](<>)[](<>)

如果您使用的是Perl`DBI`接口，您可以使用`查出`方法或通过设置`DBI_轨迹`环境变量。
