2008-10-08 3 views
5

데이터베이스가 다시 시작될 때 segfaults가 발생하고 이전 연결을 사용하려고하면 webapp가 생깁니다. gdb --args apache -X 아래를 실행하면 다음과 같은 결과에 이르게 :mod_perl에서 MySQL 드라이버 segfaulting - 문제를 찾을 곳

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 로그) 최신 상태인지 확인했습니다.

성가 시게 나는 사소한 스크립트를 사용하여이 문제를 재현 할 수

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' 

.

무엇이 나를 괴롭히는가는 segfaulting이라는 것입니다. 앱이 실행될 때 (예 : DBIx::Class 사용) 발생하는 것처럼 보이기 때문에 테스트 케이스로 축소하는 것은 어렵습니다.

어디에서 디버깅을 시작해야합니까? 다른 사람이 본 적이 있습니까?

업데이트 : mod_perl에 속하는 것이 붉은 청어 였음을 보여줍니다. 간단한 테스트 스크립트로 축소하여 이제 DBI mailing list에 게시했습니다. 귀하의 답변에 감사드립니다.

답변

3

아마도 이것은 mod_perl 환경과 스크립트를 통해 테스트 한 환경 사이에 차이점이 있음을 의미합니다. 어떤 것들은 확인 :

  • 은 mod_perl과는

  • 모두

  • 에 대한 @ INC의 같은 있습니까 펄의 동일한 버전으로 컴파일 당신이 당신의 mod_perl을 설정에서 스레드를 사용하고 있습니까? 나는 DBD :: mysql이 thread-safe하다고는 생각하지 않는다.

2

나는이 문제를 보았지만 당신과 같은 원인이 있는지 확신하지 못합니다. 우연히 응용 프로그램에서 메일을 보내기 위해 특정 모듈을 사용합니다 (이름을 잊었습니다). 프로젝트에서 문제가 발생했을 때 디버깅이 끝난 후 우리는이 메일 모듈이 열린 파일 설명자를 사용하여 이상한 일을하고 있다는 것을 알았고 콘솔 도구 sendmail을 호출 한 다른 프로세스를 포크로 처리하여 파일 설명자를 사용하여 이상한 일을 다시 수행했습니다. 나는 그것이 주위에 어지럽 혔던 파일 기술자 중 하나가 데이터베이스에 대한 연결이라고 생각하지만, 그것에 대해서는 아직 확실하지 않다. 문제는 메일을 보내기 위해 다른 모듈로 전환했을 때 사라졌습니다. 어쩌면 당신을 찾을 가치가있을 것입니다.

+0

아니요 - DBD :: mysql 또는 mysql 클라이언트 바이너리에 문제가있는 것으로 보입니다. 고마워요 :) – EvdB

2

segfault가 발생하는 경우 코어 파일을 greated 하시겠습니까? 그렇지 않으면 ulimit -c를 확인하십시오. 0을 반환하면 시스템에서 코어 파일을 만들지 않으므로 변경해야합니다. 코어 파일을 가지고 있다면 gdb 또는 유사한 도구를 사용하여 디버깅 할 수 있습니다. 특히 은 재미가없고이지만 가능합니다.

gbd /usr/bin/httpd core 

웹 흩어져 debugging core files에 대한 튜토리얼이 많이 있습니다 명령의 시작은 같을 것입니다.

업데이트 : ensuring you get core dumps from mod_perl에 대한 참조가 발견되었습니다. 도움이 될 것입니다.

+0

포인터 주셔서 감사합니다 - 나는 그것을 작은 테스트 스크립트로 줄이고 DBI 메일 링리스트 (링크에 대한 질문 참조)에 게시했다. – EvdB

관련 문제