我有一个 web 应用程序,当数据库重新启动并尝试使用旧连接时会出现段错误。在 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 ),因此很难将其简化为测试用例。
我应该从哪里开始调试它?还有其他人看到这个吗?
更新:进一步的刺激表明它在 mod_perl 下是一个转移注意力的问题。将其简化为一个简单的测试脚本后,我现在将其发布到 DBI mailing list .感谢您的回答。
最佳答案
这可能意味着您的 mod_perl 环境与您通过脚本测试的环境之间存在差异。要检查的一些事项:
您的 mod_perl 是否使用相同版本的 Perl 编译
两者的@INC 是否相同
您是否在 mod_perl 设置中使用了线程?我不相信 DBD::mysql 是完全线程安全的。
关于mod_perl 下的 MySQL 驱动程序段错误 - 在哪里寻找问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/182592/