• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在gdb下调试mysqld

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

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

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

    • mysqld在启动期间挂起(在写入之前ready for connections)。
    • pthread_mutex_lock()pthread_mutex_unlock()调用期间 mysqld崩溃。

    在这种情况下,应该在启动gdb之前在外壳程序中设置以下环境变量:

    LD_ASSUME_KERNEL=2.4.1
    export LD_ASSUME_KERNEL
    

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

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

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

    如果想要在Linuxd上以SIGSEGV信号终止linuxd 的内核转储,则可以使用该选项启动mysqld--core-file。该核心文件可用于进行回溯,以帮助您了解mysqld为何死亡:

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

    请参见第B.4.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的示例:

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

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

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

    strace /tmp/log libexec/mysqld
    

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