2011-11-01 4 views
4

예외를 포착하고 메시지를 기록한 다음 Carp::longmess을 호출하여 스택 추적을 가져 오는 코드가 있습니다.perl 잉어 모듈의 무한 루프

그래서 우리가하고있는 일의 단순화 된보기입니다

sub logwrite($) 
{ 
    my $msg = $_[0]; 
    my($pkg,$fil,$lin)=caller; 
    my $timestamp = POSIX::strftime(...); 
    print STDERR "$timestamp $fil/$lin $msg\n"; 
    print STDERR "$timestamp $fil/$lin Stack trace:\n" . Carp::longmess . "\n"; 
} 

그러나 로그에 내가보고 있어요 :

eval { <some SOAP::Lite stuff> }; 
if(my $err = [email protected]) 
{ 
    logwrite("Caught Error: $err"); 
} 

logwrite 기능은 본질적으로

20111030 Module.pm/42 Caught Error: at line 
Use of uninitialized value in caller at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 22. 
Use of uninitialized value in string eq at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 91. 
Use of uninitialized value in numeric lt (<) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 200. 
Use of uninitialized value in pattern match (m//) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55. 
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55. 
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142. 
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142. 
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142. 
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142. 
... 

그리고 Carp/Heavy.pm 모듈의 경고 시퀀스가 ​​반복적으로 반복됩니다. b logifle을 낮추십시오. 그래서 우리는 결국 그것을 죽입니다. 이 경고는 Carp::longmess에 대한 호출에 의해 트리거되는 것처럼 보입니다. 여기에있는 또 다른 단점은 [email protected] 변수가 at 인 것처럼 보입니다. 그것은 at으로 추가되었지만 실제 오류 메시지 또는 회선 번호는 없습니다.

누구나 Carp 패키지로 무엇을 연결했는지 알 수 있습니까? 드물기는하지만 지난 한 달 간 몇 차례에 걸쳐 성과를 거두었으며 매일 수백 개의 일자리가 운영됩니다.

+3

호출 스택이 어떻게 보이는지 모르는 상태에서 오류를 재현하는 방법을 모르겠습니다. 잉어는 확실히 스택 맨 위로 걸어갔습니다. Carp의 버그이거나 손상된 스택 일 수 있습니다. 잉어는 CPAN 모듈로 사용할 수 있습니까? 업그레이드를 시도합니까? https://metacpan.org/release/Carp 다른 옵션은 Perl 5.8.9를 시도하는 것입니다. – Schwern

+0

POSIX가 잉어를 호출 할 수 있습니까? 그리고 longmess에 중단 점을 설정 한 다음 단계별로 문제를 디버깅 했습니까? – DVK

+0

실제로'$ @'는'at '를 포함하지 않습니다. 빈 문자열이 있거나 undef 일 수 있습니다. 특이한 것은 아닙니다. 잉어가 파일 이름이나 줄 번호를 가져올 수 없기 때문에 훨씬 더 많이 사용됩니다. – ikegami

답변

0

나는 이것이 당신의 실제 질문에 대답하지 않는다는 것을 깨닫습니다. . . 이 경우 분명히 $msg eq 'at line ' 이래로 print ... Carp::longmess ... 성명 끝에 unless $msg eq 'at line '을 붙임으로써이 문제를 건너 뛸 수 있을까요? (누군가가 진짜 해결책을 제안하지 않는 한 내 말은)

1

코드는 perl v5.10.1에서 Carp.pm 버전 1.11로 나를 위해 작동합니다.

longmess에 의해 생성 된 백 트레이스는 내부에서 실제 오류가 발생한 곳이 아닌 logwrite 함수가 호출 된 위치를 표시합니다.