多くのシステムでは、mysqld
がクラッシュした際に、mysqld
を
gdb
から起動することで、より多くの情報を取得することもできます。
Linux で使用される旧バージョンの
gdb
の一部では、mysqld
スレッドをデバッグする際に run
--one-thread
を使用しなければなりません。この場合、一度にアクティブにできるスレッドは
1 つだけです。速やかに gdb 5.1
にアップグレードすることをお奨めします。このバージョンでは、スレッドデバッグの処理が大幅に改善されるからです。
gdb で mysqld
を実行する場合、スタックトレースを
--skip-stack-trace
で無効化し、gdb
内部で segfault
を捕捉できるようにする必要があります。
MySQL 4.0.14 以降では、mysqld に対して
--gdb
オプションを使用してください。このオプションを使用すると、SIGINT
(mysqld
を ^C
で終了し、ブレークポイントを設定するために必要)の割り込みハンドラがインストールされ、スタックトレースとコアファイル処理が無効になります。
gdb
で MySQL
をデバッグするのが非常に困難な場合があります。たとえば、古いスレッドに対するメモリが
gdb
によって解放されず、デバッグ中に大量の新規接続を連続して確立しなければならない場合です。この問題を回避するには、-O
thread_cache_size= 'max_connections +1'
を指定して mysqld
を起動します。多くの場合、-O
thread_cache_size=5'
を指定するだけで状況は大幅に改善します。
SIGSEGV シグナルで mysqld
がクラッシュした場合、Linux
上でコアダンプを取得するには、--core-file
オプションを指定して mysqld
を起動します。
このコアファイルを使用してバックトレースを作成し、mysqld
がクラッシュした理由を特定することもできます。
shell> gdb mysqld core
gdb> backtrace full
gdb> exit
See 項A.4.1. 「MySQL が何度もクラッシュする場合に行うこと」。
gdb 4.17.x 以降を 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
gdb でスレッドのデバッグに問題が起きた場合、gdb 5.x をダウンロードして代用してみてください。gdb の新規バージョンでは、スレッドの処理が飛躍的に改善されています。
以下の例は、mysqld をデバッグする方法を示します。
shell> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Do this when mysqld crashes
mysqlbug
で生成された上記の出力内容をメールに取り込み、通常の
MySQL
メーリングリスト宛てに送信してください。 See
項1.7.1.1. 「MySQL メーリングリスト」。
mysqld
がハングした場合、strace
や
/usr/proc/bin/pstack
のようなシステムツールを使用し、mysqld
がハングした場所を調べることができます。
strace /tmp/log libexec/mysqld
Perl DBI
インタフェースを使用している場合、デバッグ情報を有効にするには、trace
メソッドを使用するか DBI_TRACE
環境変数を設定します。 See
項11.5.2. 「DBI
インタフェース」。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.