У меня есть веб-приложение, которое отключается при перезапуске базы данных и пытается использовать старые подключения. Запуск его под 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 список рассылки . Спасибо за ваши ответы.