Spec-Zone.ru › MySQL 5.7

5.8.1.4 Отладка mysqld в gdb

На большинстве систем можно также запустить mysqld из gdb, чтобы получить больше информации, если mysqld завершится с ошибкой.

В некоторых старых версиях gdb на Linux необходимо использовать run --one-thread, если вы хотите отладить потоки mysqld. В этом случае можно активировать только один поток за раз.

Потоки NPTL (новая библиотека потоков на Linux) могут вызывать проблемы при запуске mysqld в gdb. Некоторые симптомы:

  • mysqld зависает во время запуска (перед записью ready for connections).

  • mysqld завершается с ошибкой во время вызова pthread_mutex_lock() или pthread_mutex_unlock().

В этом случае необходимо установить следующую переменную среды в оболочке перед запуском gdb:

LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL

При запуске mysqld в gdb, необходимо отключить трассировку стека с помощью --skip-stack-trace, чтобы можно было перехватить ошибки сегментации внутри 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.5, «Как отправить отчёт об ошибках или проблемах».

Если mysqld зависает, вы можете попробовать использовать некоторые системные инструменты, такие как strace или /usr/proc/bin/pstack, чтобы проверить, где mysqld завис.

strace /tmp/log libexec/mysqld

Если вы используете Perl интерфейс DBI, вы можете включить отладочную информацию, используя метод trace или установив переменную среды DBI_TRACE.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/using-gdb-on-mysqld.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API