文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  在 gdb 下调试 mysqld

7.9.1.4 在 gdb 下调试 mysqld

在大多数系统上,您还可以从 gdb 启动 mysqld,以便在 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 中捕获段错误。

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

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

如果您在 mysqld 因 SIGSEGV 信号终止时希望在 Linux 上获取核心转储,则可以使用 --core-file 选项启动 mysqld。此核心文件可用于生成回溯,这可能有助于您找出 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 环境变量来打开调试信息。