Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.9.1.4 在 gdb 下调试 mysqld

大多数系统上,您也可以使用 mysqldgdb 中启动,以获取更多信息,如果 mysqld 崩溃。

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

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

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

  • mysqldpthread_mutex_lock()pthread_mutex_unlock() 调用时崩溃。

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

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

当运行 mysqldgdb 时,您应该禁用堆栈跟踪,以便捕捉 gdb 中的 segfaults。

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

调试 MySQL 下 gdb 如果您不断地建立新连接,整个时间 gdb 不会释放旧线程的内存。您可以避免这个问题通过在启动 mysqld 时设置 thread_cache_sizemax_connections + 1 的值。在大多数情况下,只使用 --thread_cache_size=5' 就可以了!

如果您想在 Linux 上获取 mysqld 的核心 dump,如果 mysqld 使用 SIGSEGV 信号死亡,您可以使用 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 接口,可以通过使用 trace 方法或设置 DBI_TRACE 环境变量来打开调试信息。