データベースの再起動時にセグメンテーション違反が発生し、古い接続を使用しようとする webapp があります。下で実行するgdb --args apache -X
と、次の出力が得られます。
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1212868928 (LWP 16098)]
0xb7471c20 in mysql_send_query () from /usr/lib/libmysqlclient.so.15
ドライバーとデータベースがすべて最新であることを確認しました ( DBD::mysql 4.0008、MySQL 5.0.32-Debian_7etch6-log)。
厄介なことに、簡単なスクリプトではこれを再現できません。
use DBI;
use Test::More tests => 2;
my $dbh = DBI->connect( "dbi:mysql:test", 'root' );
sub test_db {
my ($number) = $dbh->selectrow_array("select 1 ");
return $number;
}
is test_db, 1, "connected to db";
warn "restart db now";
getc;
is test_db, 1, "connected to db";
これにより、次のようになります。
ok 1 - connected to db
restart db now at dbd-mysql-test.pl line 23.
DBD::mysql::db selectrow_array failed: MySQL server has gone away at dbd-mysql-test.pl line 17.
not ok 2 - connected to db
# Failed test 'connected to db'
# at dbd-mysql-test.pl line 26.
# got: undef
# expected: '1'
これは正しく動作し、リクエストが失敗した理由を教えてくれます。
私を悩ませているのは、それがすべきではないセグメンテーション違反であるということです。アプリ全体 ( DBIx::Classを使用) が実行されている場合にのみ発生するように見えるため、テストケースに減らすのは困難です。
これをデバッグするにはどこから始めるべきですか? 他の誰かがこれを見たことがありますか?
UPDATE : mod_perl の下にあることは赤いニシンであることがさらに示されました。これを単純なテスト スクリプトにまとめたので、DBI メーリング リストに投稿しました。回答ありがとうございます。