28.5.1.4 在 gdb 下调试 mysqld

在大多数系统上,如果mysqld崩溃,您还可以从 gdb 开始mysqld获取更多信息。

对于 Linux 上的某些旧版本 gdb ,如果要调试mysqld个线程,则必须使用run --one-thread。在这种情况下,一次只能激活一个线程。

NPTL 线程(Linux 上的新线程库)在 gdb 下运行mysqld时可能会引起问题。一些症状是:

  • mysqld在启动期间挂起(在写入ready for connections之前)。

  • mysqldpthread_mutex_lock()pthread_mutex_unlock()通话期间崩溃。

在这种情况下,您应该在启动 gdb 之前在 shell 中设置以下环境变量:

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

gdb 下运行mysqld时,应使用--skip-stack-trace禁用堆栈跟踪,以便能够捕获 gdb 中的段错误。

使用mysqld--gdb选项为SIGINT安装中断处理程序(需要通过^C停止mysqld来设置断点)并禁用堆栈跟踪和核心文件处理。

如果您一直进行大量新连接,那么在 gdb 下调试 MySQL 非常困难,因为 gdb 不会为旧线程释放内存。您可以通过将thread_cache_size设置为等于max_connections 1 的值来启动mysqld来避免此问题。在大多数情况下,仅使用--thread_cache_size=5'会很有帮助!

如果您想在mysqld通过 SIGSEGVsignal 死亡时在 Linux 上进行核心转储,则可以使用--core-file选项启动mysqld。此核心文件可用于进行回溯,以帮助您确定mysqld死亡的原因:

shell> gdb mysqld core
gdb>   backtrace full
gdb>   quit

See 第 B.4.3.3 节“如果 MySQLcontinue 崩溃该怎么办”.

如果在 Linux 上使用 gdb ,则应在当前目录中安装包含以下信息的.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的示例:

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

将先前的输出包括在错误报告中,您可以使用第 1.7 节“如何报告错误或问题”中的说明进行归档。

如果mysqld挂起,则可以尝试使用strace/usr/proc/bin/pstack之类的某些系统工具来检查mysqld的挂起位置。

strace /tmp/log libexec/mysqld

如果使用的是 Perl DBI界面,则可以使用trace方法或设置DBI_TRACE环境变量来打开调试信息。