mod_perl 下的 MySQL 驱动程序段错误 - 在哪里寻找问题

标签 mysql perl mod-perl

我有一个 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/

相关文章:

linux - Perl脚本在linux终端中运行,但在浏览器中出现错误

perl - 在sprintf中截断(不舍入)小数位?

apache - mod_perl "use"随机失败

perl - 如何使用 ModPerl::Registry(mod_perl 处理程序)检测 Perl 中的 Web 脚本是否运行?

mysql - 在关系数据库中,所有将在查询中排序的列都应该有一个索引吗?

mysql - mysql扩展名已弃用,以后将删除:使用mysqli或PDO代替

Mysql:如何根据日期检查订单的有效性

php - 如何在 PHP 中删除 json 中的重复项

perl - 为什么 DBI 的 RaiseError 不总是触发我的 CORE::GLOBAL::die 子例程?

linux - 在单个命令中使用变量在 grep 多个结果上附加字符串