5

データベースの再起動時にセグメンテーション違反が発生し、古い接続を使用しようとする 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 メーリング リストに投稿しました。回答ありがとうございます。

4

4 に答える 4

3

これがおそらく意味することは、mod_perl環境と、スクリプトを介してテストしていた環境との間に違いがあるということです。確認すべき点:

  • mod_perlは同じバージョンのPerlでコンパイルされましたか

  • @INCは両方で同じですか

  • mod_perlのセットアップでスレッドを使用していますか?DBD::mysqlが完全にスレッドセーフだとは思いません。

于 2008-10-08T13:30:50.483 に答える
2

私はこの問題を見てきましたが、あなたと同じ原因があるかどうかはわかりません。たまたま、アプリケーションからメールを送信するために特定のモジュールを使用していませんか (名前を忘れました、すみません)。プロジェクトで問題が発生したとき、何日もデバッグを行った後、このメール モジュールが開いているファイル記述子で奇妙なことを行っていることがわかりました。その後、コンソール ツールの sendmail を呼び出す別のプロセスが分岐し、ファイル記述子で奇妙なことを行いました。私はそれが混乱したファイル記述子の1つがデータベースへの接続だったと思いますが、それについてはまだわかりません. メールを送信するための別のモジュールに切り替えると、問題はなくなりました。たぶん、あなたにとっても一見の価値があります。

于 2008-10-08T22:31:10.673 に答える
2

segfault が発生している場合、コア ファイルは強化されていますか? そうでない場合は、ulimit -c を確認してください。それが 0 を返す場合、システムはコア ファイルを作成しないため、それを変更する必要があります。コア ファイルがある場合は、gdb または同様のツールを使用してデバッグできます。特に楽しいわけではありませんが、可能です。コマンドの開始は次のようになります。

gbd /usr/bin/httpd core

Web には、コア ファイルをデバッグするためのチュートリアルがたくさんあります。

更新: mod_perl から確実にコア ダンプを取得するための参照が見つかりました。それは役立つはずです。

于 2008-10-09T07:12:36.313 に答える
1

これは古い DBD::mysql の既知の問題です。アップグレードしてください (4.008 は最新ではありません)。

このバグをトリガーする簡単なテスト スクリプトがhttps://rt.cpan.org/Public/Bug/Display.html?id=37027に添付されています。

于 2010-08-15T22:56:28.493 に答える