Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

7.9.1.4 在gdb下调试mysqld

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

在某些旧版本的 gdb 中,在 Linux 上您必须使用 run --one-thread 如果您想调试 mysqld 线程。在这种情况下,您只能有一个线程活动。

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

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

  • mysqldpthread_mutex_lock()pthread_mutex_unlock() 调用期间崩溃。

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

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

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

使用 --gdb 选项来 mysqld 安装一个中断处理程序,以便在 SIGINT 信号下停止 mysqld 并禁用堆栈跟踪和核心文件处理。

如果您不断地新建连接,调试 MySQL 在 gdb 下非常困难,因为 gdb 不会释放旧线程的内存。您可以通过将 mysqld 启动时将 thread_cache_size 设置为 max_connections + 1 来避免这个问题。在大多数情况下,使用 --thread_cache_size=5' 就足够了!

如果您想在 Linux 上获取核心转储文件,如果 mysqld 因 SIGSEGV 信号而死亡,您可以使用 --core-file 选项启动 mysqld。该核心文件可以用来生成回溯信息,以帮助您找到 mysqld 死亡的原因:

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

请参阅 第 B.3.3.3 节,“如果 MySQL 不断崩溃”

如果您使用 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

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

请在 bug 报告中包含前面的输出,按照 第 1.5 节,“如何报告 bug 或问题” 中的说明进行报告。

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

strace /tmp/log libexec/mysqld

如果您使用 Perl DBI 接口,可以通过使用 trace 方法或设置 DBI_TRACE 环境变量来打开调试信息。