Как разбить конкретную строку файла require'd в отладчике Perl? - PullRequest
5 голосов
/ 12 июня 2010

У меня есть Perl-скрипт, назовем его A.pl, где первые две строки выглядят примерно так:

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

Где у B.pl и C.pl каждая есть своя собственная кавалькадатребует.Мне нужно установить точку останова на конкретной строке C.pl.В GDB я бы сделал что-то вроде:

b C.pl:830

Однако здесь это, похоже, совсем не работает.Является ли это возможным?Я рядом?

Ответы [ 4 ]

2 голосов
/ 05 июня 2012

Вы также можете отредактировать C.pl, добавив:

$DB:single = 1;

, и отладчик остановится сразу после выполнения этой строки и перед выполнением следующей строки.Это похоже на оператор Ruby 'debugger'.

См. Также: perldoc DB

1 голос
/ 07 июня 2012

Я предпочитаю дешевую уловку команды отладчика 'R' (перезапуск). Вот пример программы:

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

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

и давайте предположим, что мы хотим разбить метод new () LWP :: UserAgent. Сделайте это:

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();

Загрузите модуль, в котором вы хотите установить точку останова:

  DB<1> use LWP::UserAgent 

Напечатайте его запись @INC, чтобы выяснить, какой файл вы только что загрузили (необходимо выполнить команду '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

Переключиться на этот файл с помощью 'f':

  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 ();

Мы хотим взломать new (), поэтому найдите его:

  DB<4> /new
20: sub new

Найдите первый исполняемый оператор в подпрограмме через 'l':

  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<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 () для интересующего вас модуля.

1 голос
/ 12 июня 2010

Вы не можете сделать это за один шаг, но вы можете перейти к нужному файлу и затем установить точку останова на определенной строке:

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

DB<2> b 830

DB<3> c
0 голосов
/ 12 июня 2010

Как насчет использования команды c, чтобы пропустить require s и затем установить точку останова. Например

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> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...