Evd*_*vdB 5 mysql perl mod-perl
我有一个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
Run Code Online (Sandbox Code Playgroud)
我已经检查过驱动程序和数据库都是最新的(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";
Run Code Online (Sandbox Code Playgroud)
这给出了以下内容:
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'
Run Code Online (Sandbox Code Playgroud)
这行为正确,告诉我为什么请求失败.
让我感到困惑的是它是segfaulting,它不应该做.因为它似乎只在整个应用程序运行时发生(它使用DBIx :: Class),所以很难将其减少到测试用例.
我应该从哪里开始调试这个?有没有人见过这个?
更新:进一步的刺激显示它在mod_perl下是一个红鲱鱼.将它简化为一个简单的测试脚本我现在已经发布到DBI邮件列表了.谢谢你的回答.
这是旧 DBD::mysql 中的一个已知问题。升级它(4.008 不是最新的)。
https://rt.cpan.org/Public/Bug/Display.html?id=37027附加了一个简单的测试脚本 ,它将触发此错误。