一部のオペレーティングシステムでは、mysqld
が突然クラッシュするとスタックトレースがエラーログに記録されます。この情報を使用すると、mysqld
がクラッシュした場所(および理由)を確認することができます。See
項4.10.1. 「エラーログ」。
スタックトレースを取得する場合、mysqld
のコンパイルを -fomit-frame-pointer
オプション付き gcc で行わないでください。 See
項E.1.1. 「MYSQL のコンパイル(デバッグ用)」。
エラーファイルの内容が以下のとおりであるとします。
mysqld got signal 11; The manual section 'Debugging a MySQL server' tells you how to use a stack trace and/or the core file to produce a readable backtrace that may help in finding out why mysqld died Attemping backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong stack range sanity check, ok, backtrace follows 0x40077552 0x81281a0 0x8128f47 0x8127be0 0x8127995 0x8104947 0x80ff28f 0x810131b 0x80ee4bc 0x80c3c91 0x80c6b43 0x80c1fd9 0x80c1686
mysqld
がクラッシュした場所を特定するには、以下を実行します。
上記の番号をファイル(たとえば
mysqld.stack
)にコピーする。
mysqld
サーバのシンボルファイルを作成する。
nm -n libexec/mysqld > /tmp/mysqld.sym
注意: 多くの MySQL
バイナリディストリビューション(この情報がバイナリ自体の内部に含まれている
"デバッグ"
パッケージは除外)には、上記のファイルが
mysqld.sym.gz
という名称で同梱されています。
ここでは、このファイルを以下のように簡単に解凍できます。
gunzip < bin/mysqld.sym.gz > /tmp/mysqld.sym
resolve_stack_dump -s /tmp/mysqld.sym -n
mysqld.stack
を実行する。
実行すると、mysqld
がクラッシュした場所が出力されます。mysqld
がクラッシュした原因をこの方法で特定できない場合には、バグレポートを作成し、上記コマンドの出力結果をバグレポートに含める必要があります。
ただし、多くの場合、スタックトレースだけでは問題の理由を特定できません。バグを見つけるか次善策を講じるには、多くの場合、mysqld
のクラッシュを引き起こしたクエリのほか、可能であれば問題を再現できるテストテースについても知る必要があります。
See 項1.7.1.3. 「バグまたは問題を報告する方法」。
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.