如果mysqld崩溃(crash),在大多系统下你也可以从gdb启动mysqld来获取更多信息。
linix上一些较老的gdb版本,如果你想能调试mysqld线程,你必须使用run --one-thread。这种情况下,一次只能激活一个线程。
在gdb下运行mysqld时,NTPL线程(linix上的new thread library)可能会有一些问题。一些如下:
在启动期间mysqld hang了(在为连接做好准备之前)。
在pthread_mutex_lock或pthread_mutex_unlock调用期间mysqld crash了。
这种情况下,你应该在启动mysqld之前在shell中设置如下环境变量:
当在gdb下运行mysqld时,您应该使用–skip-stack-trace禁用堆栈跟踪,以便能够捕获gdb中的段错误。
使用–gdb选项来使mysqld为SIGINT(需要使用^ C停止mysqld来设置断点)安装一个中断处理器和禁用堆栈跟踪和core文件处理。
如果您一直进行大量新连接,则很难在gdb下调试MySQL,因为gdb不会为旧线程释放内存。你可以把thread_cache_size设为max_connextions+1来启动mysqld以避免这个问题。大多情况下,使用–thread_cache_size=5会很有帮助。
如果要在Linux上通过SIGSEGV信号得到mysqld的core dump,可以使用–core-file选项启动mysqld。这个core文件可用于回溯,来帮你找出mysqld挂掉的原因:
参见B.3.3.3节,”如果mysql持续崩溃该怎么做”
如果你正在linux上使用gdb,你应该在你的当前目录,使用以下信息,安装一个.gdb文件
这是一个如果调试mysqld的例子:
将先前的输出放在错误报告中,您可以使用第1.6节“如何报告错误或问题”中的说明进行归档。
如果mysql hang了,你可以尝试使用一些系统工具如strace或/usr/proc/bin/pstack来检查mysqld是否hang了
如果使用的是Perl DBI接口,则可以通过使用trace方法或设置DBI_TRACE环境变量来打开调试信息。