Documentation Home

5.9.1.4 在gdb下调试mysqld

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

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

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

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

  • mysqldpthread_mutex_lock()在or pthread_mutex_unlock()调用 期间崩溃

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

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

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

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

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

如果您希望在 mysqld因 SIGSEGV 信号而死时在 Linux 上获得核心转储,您可以使用该 选项启动mysqld 。--core-file这个核心文件可以用来做一个回溯,可以帮助你找出mysqld死掉的原因:

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

请参阅第 B.3.3.3 节,“如果 MySQL 持续崩溃怎么办”

如果您在 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的例子:

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

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

如果mysqld挂起,您可以尝试使用一些系统工具,例如strace/usr/proc/bin/pstack检查 mysqld挂起的位置。

strace /tmp/log libexec/mysqld

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