7.9.1.4 Отладка mysqld в gdb
На большинстве систем также можно запустить mysqld из gdb, чтобы получить больше информации, если mysqld завершится с ошибкой.
В некоторых старых версиях gdb на Linux необходимо использовать run --one-thread, если вы хотите иметь возможность отладить потоки mysqld. В этом случае активным может быть только один поток одновременно.
Потоки NPTL (новая библиотека потоков на Linux) могут вызвать проблемы при запуске mysqld в gdb. Некоторые симптомы:
В этом случае необходимо установить следующую переменную среды в оболочке перед запуском gdb:
LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL
При запуске mysqld в gdb следует отключить трассировку стека с помощью --skip-stack-trace, чтобы можно было перехватить ошибки segfaults внутри gdb.
Используйте опцию --gdb для mysqld, чтобы установить обработчик прерываний для SIGINT (необходимый для остановки mysqld с помощью ^C для установки точек останова) и отключить трассировку стека и обработку файла core.
Очень сложно отлаживать MySQL в gdb, если постоянно происходят новые подключения, так как gdb не освобождает память для старых потоков. Эту проблему можно избежать, запустив mysqld с thread_cache_size, установленной в значение, равное max_connections + 1. В большинстве случаев просто использование --thread_cache_size=5' очень помогает!
Если вы хотите получить дамп ядра на Linux, если mysqld завершится с сигналом SIGSEGV, можно запустить mysqld с опцией --core-file. Этот файл core можно использовать для создания трассировки стека, которая может помочь вам выяснить, почему mysqld завершился с ошибкой:
$> gdb mysqld core
gdb> backtrace full
gdb> quit
См. Раздел B.3.3.3, «Что делать, если MySQL постоянно завершается с ошибкой».
Если вы используете gdb на Linux, следует установить файл .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:
$> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Do this when mysqld crashes
Включите указанный выше вывод в отчёт об ошибке, который можно отправить, следуя инструкциям в Разделе 1.6, «Как сообщить об ошибках или проблемах».
Если mysqld зависает, можно попробовать использовать некоторые системные инструменты, такие как strace или /usr/proc/bin/pstack, чтобы выяснить, где mysqld завис.
strace /tmp/log libexec/mysqld
Если вы используете интерфейс Perl DBI, можно включить отладочную информацию, используя метод trace или установив переменную среды DBI_TRACE.
© 2025 Oracle
Licensed under the GPLv2 License.