Spec-Zone .ru
спецификации, руководства, описания, API

23.4.1.5. Используя Трассировку Стека

На некоторых операционных системах журнал ошибок содержит трассировку стека, если mysqld неожиданно умирает. Можно использовать это, чтобы узнать, где (и возможно почему) mysqld умер. См. Раздел 5.2.2, "Журнал ошибок". Чтобы получить трассировку стека, не следует скомпилировать mysqld с -fomit-frame-pointer опция к gcc. См. Раздел 23.4.1.1, "Компилируя MySQL для Отладки".

Трассировка стека в журнале ошибок выглядит примерно так:

mysqld got signal 11;Attempting backtrace. You can use the following informationto find out where mysqld died. If you see no messages afterthis, something went terribly wrong...stack_bottom = 0x41fd0110 thread_stack 0x40000mysqld(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 informationto find out where mysqld died. If you see no messages afterthis, something went terribly wrong...stack_bottom = 0x41fd0110 thread_stack 0x40000[0x9da402][0x6648e9][0x7f1a5af000f0][0x7f1a5a10f0f2][0x7412cb][0x688354][0x688494][0x67a170][0x67f0ad][0x67fdf8][0x6811b6][0x66e05e]

В последнем случае можно использовать resolve_stack_dump утилиту, чтобы определить, где mysqld умер при использовании следующей процедуры:

  1. Скопируйте числа от трассировки стека до файла, например mysqld.stack. Числа не должны включать окружающие квадратные скобки:

    0x9da4020x6648e90x7f1a5af000f00x7f1a5a10f0f20x7412cb0x6883540x6884940x67a1700x67f0ad0x67fdf80x6811b60x66e05e
  2. Сделайте файл символов для mysqld сервера:

    shell> nm -n libexec/mysqld >
                        /tmp/mysqld.sym

    Если mysqld не соединяется статически, используйте следующую команду вместо этого:

    shell> nm -D -n libexec/mysqld >
                        /tmp/mysqld.sym

    Если Вы хотите декодировать символы C++, используйте --demangle, при наличии, к нм. Если у Вашей версии нм не будет этой опции, то Вы должны будете использовать c++ filt команда после того, как дамп стека был произведен для demangle имена C++.

  3. Выполните следующую команду:

    shell> resolve_stack_dump -s
                        /tmp/mysqld.sym -n mysqld.stack

    Если Вы не смогли включать demangled имена C++ в свой файл символов, обработайте вывод resolve_stack_dump, используя c++ filt:

    shell> resolve_stack_dump -s
                        /tmp/mysqld.sym -n mysqld.stack | c++filt

    Это распечатывает, где mysqld умер. Если это не помогает Вам узнать, почему mysqld умер, следует создать отчет об ошибках и включать вывод от предыдущей команды с отчетом об ошибках.

    Однако, в большинстве случаев это не помогает нам иметь только трассировку стека, чтобы найти причину проблемы. Чтобы быть в состоянии определить местоположение ошибки или обеспечить обходное решение, в большинстве случаев мы должны знать оператор, который уничтожил mysqld и предпочтительно прецедент так, чтобы мы могли повторить проблему! См. Раздел 1.7, "Как Сообщить об Ошибках или проблемах".

Более новые версии glibc сложите функции трассировки, также печатают адрес как относительно объекта. На glibcНа основе системы (Linux), трассировка для катастрофического отказа в пределах плагина смотрит что-то как:

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

Преобразовывать относительный адрес (+0x9a6) в имя файла и номер строки, используйте эту команду:

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

addr2line утилита является частью binutils пакет на Linux.

На Солярисе процедура подобна. Солярис printstack() уже адреса родственника печатных изданий:

plugin/auth/auth_test_plugin.so:0x1510

Чтобы преобразовать, используйте эту команду:

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

Windows уже печатает адрес, имя функции и строку:

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