Spec-Zone .ru
спецификации, руководства, описания, API
|
На некоторых операционных системах журнал ошибок содержит трассировку стека, если 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 умер при использовании следующей процедуры:
Скопируйте числа от трассировки стека до файла, например mysqld.stack
.
Числа не должны включать окружающие квадратные скобки:
0x9da4020x6648e90x7f1a5af000f00x7f1a5a10f0f20x7412cb0x6883540x6884940x67a1700x67f0ad0x67fdf80x6811b60x66e05e
Сделайте файл символов для 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++.
Выполните следующую команду:
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
0x9a6
auth_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
0x1510
mysql-trunk/plugin/auth/test_plugin.c:88
Windows уже печатает адрес, имя функции и строку:
000007FEF07E10A4 auth_test_plugin.dll!auth_test_plugin()[test_plugin.c:72]