2010-06-11 3 views
5

내가 펄 스크립트를 가지고, 처음 두 행은 다음과 같이 보일 경우의이 A.pl을 부르 자 :Perl 디버거에서 require'd 파일의 특정 줄을 어기는 방법은 무엇입니까?

require 'B.pl'; 
require 'C.pl'; 

을 모두 B.plC.pl 각각 필요로 자신의 기마대가 어디. C.pl의 특정 줄에 중단 점을 설정해야합니다. GDB에서 나는 다음과 같은 것을 할 것입니다 :

b C.pl:830 

그러나 여기서는 전혀 작동하지 않는 것 같습니다. 가능한가? 내가 닫을 까?

+0

나는 이것을 결코 알 수 없었습니다. upvoted 대답을 받아들이 기 때문에이 질문은 답이 없습니다. – Morinar

답변

1

당신은 한 번에 할 수 없어,하지만 당신은 당신이 원하는 파일로 변경 한 다음 특정 라인에 브레이크 포인트를 설정할 수 있습니다

DB<1> f C.pl 
1 #!perl -w 
2 # This is C.pl 
3 # ... 

DB<2> b 830 

DB<3> c 
+0

'f'는'require'가 작동하지 않는 것으로 보입니다. 파일이로드되지 않았다고 말합니다. – Morinar

+0

파일을로드 할 때 중단 점을 설정하려면 'b load '을 수행 할 수 있지만, 중단 점을 설정하기 전에 파일을로드해야합니다. –

+0

내가 그렇게 할 때, 그것은 전혀 깨지지 않습니다. – Morinar

0

c 명령을 사용하는 방법에 대한 건너 뛰고하는 방법 require을 입력 한 다음 중단 점을 설정하십시오.

$DB:single = 1; 

을 디버거 바로 그 라인을 실행 한 후, 다음 라인을 실행하기 전에 중지됩니다 : 예를

main::(prog:6): require "A.pl"; 
    DB<1> l 
6==> require "A.pl"; 
7 
8: bar(); 
    DB<2> c 8 
main::(prog:8): bar(); 
    DB<3> b bar 
    DB<4> c 
main::bar(C.pl:2): print "A\n"; 
    DB<4>
+0

두 번째 파일을 밟은 다음 줄에 중단 점을 설정하면 그 줄이 깨지지 않는다고 알려줍니다. – Morinar

+0

@Morinar : 실행할 수있는 줄에만 중단 점을 설정할 수 있습니다. 일반적으로 표현식의 첫 번째 행을 의미하는 여러 줄 명령문의 경우. –

+0

중단 점을 설정하려고하는 행은 한 줄의'if' 문입니다. 해당 파일의 모든 줄에 중단 점을 설정할 수 없습니다. 여기 뭔가 잘못되었지만 무엇을 알아낼 수없는 것 같습니다. – Morinar

2

를 들어 당신은 또한 C.pl이 추가 편집 할 수 있습니다. 이것은 Ruby의 '디버거'문과 비슷합니다.

은 참조 :

+0

이것은 $ DB :: single = 1이어야합니다. 단일 콜론에이 변수를 처리하기위한 잘못된 구문이 있습니다. – bradoaks

1

perldoc DB 내가 디버거의 'R'(다시 시작) 명령의 싼 트릭을 선호합니다. 여기에 샘플 프로그램이 있습니다 :

#/usr/bin/perl -d 
use strict; 
use warnings; 
use WWW::Mechanize; 

my $agent = WWW::Mechanize->new(); 

그리고 우리는 LWP :: UserAgent의 new() 메소드에서 중단하고 싶다고 가정 해 봅시다.이 작업을 수행합니다 :

bash$ perl -d sample.pl --whatever-arguments 
Loading DB routines from perl5db.pl version 1.37 
Editor support available. 

Enter h or 'h h' for help, or 'man perldebug' for more help. 

main::(use_mech.pl:7): my $foo = WWW::Mechanize::Pluggable->new(); 

로드 모듈은 당신이 중단 점을 설정하려면 : 당신은 그냥합니다 ('F'를 할 필요가로드 된 파일 알아낼

DB<1> use LWP::UserAgent 

인쇄의 @INC 항목을 명령

DB<3> f /Users/joemcmahon/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/LWP/UserAgent.pm 
1 package LWP::UserAgent; 
2 
3: use strict; 
4: use vars qw(@ISA $VERSION); 
5 
6: require LWP::MemberMixin; 
7: @ISA = qw(LWP::MemberMixin); 
8: $VERSION = "6.04"; 
9 
10: use HTTP::Request(); 
:) : 'F'에 해당 파일

DB<2> p $INC{"LWP/UserAgent.pm"} 
/Users/joemcmahon/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/LWP/UserAgent.pm 

스위치

우리는) ​​(새에 헤어지고 싶어, 그래서 그것을 발견 :

DB<5> l 
20 sub new 
21 { 
22  # Check for common user mistake 
23:  Carp::croak("Options to LWP::UserAgent should be key/value pairs, not hash reference") 
24   if ref($_[1]) eq 'HASH'; 
25 
26:  my($class, %cnf) = @_; 
27 
28:  my $agent = delete $cnf{agent}; 
29:  my $from = delete $cnf{from}; 

이 줄에 중단 점을 설정 :

DB<4> /new 
20: sub new 

는 'L'을 통해 하위의 첫 번째 실행 문을 찾기

DB<5> b 23 

다시 시작 디버거 :

DB<6> R 
Warning: some settings and command-line options may be lost! 

Loading DB routines from perl5db.pl version 1.37 
Editor support available. 

Enter h or 'h h' for help, or 'man perldebug' for more help. 

main::(use_mech.pl:7): my $foo = WWW::Mechanize::Pluggable->new(); 

프로그램을 실행하면 원하는 시점에 중단됩니다.

DB<6> c 
LWP::UserAgent::new(/Users/joemcmahon/perl5/perlbrew/perls/perl-5.16.0/lib/site_perl/5.16.0/LWP/UserAgent.pm:23): 
23:  Carp::croak("Options to LWP::UserAgent should be key/value pairs, not hash reference") 
24:   if ref($_[1]) eq 'HASH'; 
    DB<6> 

이 기술은 import() 문제를 디버깅 할 때 특히 편리합니다. 문제가있는 모듈을로드 할 수 있습니다. import()에 중단 점을 설정 한 다음 다시 시작하십시오. 디버거는 관심있는 모듈의 import()에서 멈추게됩니다.

관련 문제