어떻게 펄에서 스택 트레이스를 얻을 수 있습니까?Perl에서 스택 트레이스 가져 오기?
21
A
답변
14
많은 유용한 cor e 및 CPAN 기반 도구를 사용하여 스택 추적을 생성합니다 (다른 답변에서 설명한 것처럼). 그러나 직접 롤업하려면 caller
내장 명령을 확인하십시오. 이것을 사용하여 스택을 걸어 내려 와서 무슨 일이 일어나는지 정확하게 볼 수 있습니다.
31
Carp::confess
(use Carp;
)은 오류의 일부로 전체 스택 추적을 제공합니다. 당신이 실패한 무언가의 부분으로 다만 그것을 필요로하는 경우에, confess
는 진짜로 모두이다.
, 여기에 다양한 Carp
기능의 출력입니다 :
use strict;
use warnings;
use Carp qw/longmess cluck confess/;
sub foo {
&bar;
}
sub bar {
&baz;
}
sub baz {
shift->();
}
my %tests = (
'longmess' => sub { print longmess 'longmess' },
'cluck' => sub { cluck 'using cluck' },
'confess' => sub { confess 'using confess' },
);
while (my ($name, $sub) = each %tests) {
print "$name - before eval:\n";
eval {
foo($sub);
};
print "$name - before if:\n";
if ([email protected]) {
print "caught: [email protected]";
}
print "$name - done\n\n";
}
이 스크립트를 실행, 당신이 얻을 :
longmess - before eval: longmess at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a4d0)') called at - line 26 eval {...} called at - line 25 longmess - before if: longmess - done confess - before eval: confess - before if: caught: using confess at - line 20 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a3e0)') called at - line 26 eval {...} called at - line 25 confess - done cluck - before eval: using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25 cluck - before if: cluck - done
이 스크립트를 실행하지만, STDOUT 리디렉션 (따라서 STDERR에 인쇄됩니다 어떤 표시) , 당신은 얻는다 :
using cluck at - line 19 main::__ANON__() called at - line 14 main::baz called at - line 10 main::bar called at - line 6 main::foo('CODE(0x183a434)') called at - line 26 eval {...} called at - line 25
31
디버깅이 필요하면 Carp::Always을 좋아합니다.
perl -MCarp::Always my_script.pl
+1
-MCarp = verbose 할 필요가있는 것처럼 보입니다. – brianegge
9
caller
을 사용하는 쉬운 방법. 이 코드는 추가 모듈을 사용하지 않습니다. 필요한 곳에 포함 시키십시오.
my $i = 1;
print "Stack Trace:\n";
while ((my @call_details = (caller($i++)))){
print $call_details[1].":".$call_details[2]." in function ".$call_details[3]."\n";
}
관련 문제
- 1. HP-UX에서 libunwind 사용 및 스택 트레이스 가져 오기
- 2. 도움말 이해이 스택 트레이스
- 3. rspec 스택 트레이스 autotest
- 4. 스택 트레이스 VS2010
- 5. Matlab의 이중 스택 Java 스택 트레이스
- 6. 스택 트레이스 창 다시 표시
- 7. 웹 서비스 클라이언트 스택 트레이스
- 8. JBoss 5 - 스택 트레이스 해독
- 9. JVM의 스택 프레임에서 로컬 변수 가져 오기
- 10. 자바 스택 트레이스 콘솔에 가기위한 단축키
- 11. 콘솔에 maven의 확실한 스택 트레이스 표시하기
- 12. Xcode 3.2.1 및 인스트루먼트 : 쓸모없는 스택 트레이스
- 13. ReSharper 포장 테스트 결과 스택 트레이스?
- 14. Qt에서 스택 트레이스 또는 장치 크래시 로그를 검색하는 방법은 무엇입니까?
- 15. .NET 릴리스 모드 빌드에서 스택 트레이스 정보를 사용할 수 있습니까?
- 16. Perl에서 호출 스택 목록을 얻으려면 어떻게해야합니까?
- 17. 여기, 내 스택 추적에서 일부 정보가 누락 될 것으로 보인다 스택 트레이스 정보
- 18. 가져 오기 배열 가져 오기
- 19. 저장소에 커밋하지 않고 무한 "실행 취소 스택"가져 오기?
- 20. WPF에서 TreeViewItem 가져 오기
- 21. 백 트레이스 by SIGSEGV
- 22. Perl, 모든 해시 값 가져 오기
- 23. 플러그인 가져 오기 UTI 유형 가져 오기
- 24. 코어 덤프에서 stacktrace 가져 오기
- 25. gdb 자동화 : 10ms마다 백 트레이스 표시
- 26. 파일 가져 오기/불러 오기
- 27. 그로크에서 이중 가져 오기
- 28. 위키 백과의 콘텐츠 가져 오기
- 29. 처리되지 않은 예외가 발생할 때 Javascript 스택 트레이스/호출 스택을 얻으려고합니다.
- 30. 생산 로그 파일에서 Rails RoutingError 스택 트레이스 출력을 비활성화하는 방법은 무엇입니까?
어, 아니면'Devel :: StackTrace'를 사용하십시오. – jrockway
그건 좋은, 다른 옵션입니다. 그러나 외부 모듈이 필요합니다. 외부 모듈은 매력적일 수도 있고 그렇지 않을 수도 있습니다. 그냥 downvoting 대신 대답으로 게시하지 않는 이유는 무엇입니까? –