我有一个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,"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'
这行为正确,告诉我为什么请求失败.
让我感到困惑的是它是segfaulting,它不应该做.因为它似乎只在整个应用程序运行时发生(使用DBIx::Class),所以很难将其减少到测试用例.
我应该从哪里开始调试这个?有没有人见过这个?
更新:进一步的刺激显示它在mod_perl下是一个红鲱鱼.将它简化为一个简单的测试脚本我现在已发布到DBI mailing list.感谢您的回答.
解决方法
这是旧DBD :: MysqL中的已知问题.升级它(4.008不是最新的).
有一个简单的测试脚本附加到https://rt.cpan.org/Public/Bug/Display.html?id=37027这将触发这个错误.