• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用堆栈跟踪

    在某些操作系统上,如果mysqld意外死亡,则错误日志包含堆栈跟踪。您可以使用它来找出mysqld死于何处(也许是为什么)。请参见“MySQL服务器错误日志”。为了获得堆栈跟踪,必须不要编译带有 gcc选项的mysqld-fomit-frame-pointer。请参见 29.5.1.1,“编译MySQL以进行调试”。

    错误日志中的堆栈跟踪如下所示:

    mysqld got signal 11;
    Attempting backtrace. You can use the following information
    to find out where mysqld died. If you see no messages after
    this, something went terribly wrong...
    
    stack_bottom = 0x41fd0110 thread_stack 0x40000
    mysqld(my_print_stacktrace+0x32)[0x9da402]
    mysqld(handle_segfault+0x28a)[0x6648e9]
    /lib/libpthread.so.0[0x7f1a5af000f0]
    /lib/libc.so.6(strcmp+0x2)[0x7f1a5a10f0f2]
    mysqld(_Z21check_change_passwordP3THDPKcS2_Pcj+0x7c)[0x7412cb]
    mysqld(_ZN16set_var_password5checkEP3THD+0xd0)[0x688354]
    mysqld(_Z17sql_set_variablesP3THDP4ListI12set_var_baseE+0x68)[0x688494]
    mysqld(_Z21mysql_execute_commandP3THD+0x41a0)[0x67a170]
    mysqld(_Z11mysql_parseP3THDPKcjPS2_+0x282)[0x67f0ad]
    mysqld(_Z16dispatch_command19enum_server_commandP3THDPcj+0xbb7[0x67fdf8]
    mysqld(_Z10do_commandP3THD+0x24d)[0x6811b6]
    mysqld(handle_one_connection+0x11c)[0x66e05e]
    

    如果跟踪的函数名称解析失败,则跟踪将包含较少的信息:

    mysqld got signal 11;
    Attempting backtrace. You can use the following information
    to find out where mysqld died. If you see no messages after
    this, something went terribly wrong...
    
    stack_bottom = 0x41fd0110 thread_stack 0x40000
    [0x9da402]
    [0x6648e9]
    [0x7f1a5af000f0]
    [0x7f1a5a10f0f2]
    [0x7412cb]
    [0x688354]
    [0x688494]
    [0x67a170]
    [0x67f0ad]
    [0x67fdf8]
    [0x6811b6]
    [0x66e05e]
    

    较新版本的glibc堆栈跟踪功能还会打印相对于对象的地址。在glibc基于系统的系统(Linux)上,插件内崩溃的跟踪类似于:

    plugin/auth/auth_test_plugin.so(+0x9a6)[0x7ff4d11c29a6]
    

    要将相对地址(+0x9a6)转换为文件名和行号,请使用以下命令:

    shell>addr2line -fie auth_test_plugin.so 0x9a6
    auth_test_plugin
    mysql-trunk/plugin/auth/test_plugin.c:65
    

    addr2line实用程序是部分binutils包在Linux上。

    在Solaris上,过程类似。Solaris printstack()已经打印了相对地址:

    plugin/auth/auth_test_plugin.so:0x1510
    

    要翻译,请使用以下命令:

    shell>gaddr2line -fie auth_test_plugin.so 0x1510
    mysql-trunk/plugin/auth/test_plugin.c:88
    

    Windows已经打印了地址,函数名称和行:

    000007FEF07E10A4 auth_test_plugin.dll!auth_test_plugin()[test_plugin.c:72]