2010-06-11 11 views
5

Tengo un script Perl, vamos a llamarlo A.pl donde las dos primeras líneas tienen el siguiente aspecto:¿Cómo se divide una línea específica de un archivo requerido en el depurador Perl?

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

Cuando ambos B.pl y C.pl cada uno tiene su propia cabalgata de requiere. Necesito establecer un punto de interrupción en una línea específica de C.pl. En GDB haría algo como:

b C.pl:830 

Sin embargo, eso no parece funcionar en absoluto aquí. ¿Es posible? ¿Estoy cerca?

+0

Nunca pude resolver esto. Voy a aceptar la respuesta votada para que esta pregunta no quede sin respuesta. – Morinar

Respuesta

1

No se puede hacer en un solo paso, pero se puede cambiar en el archivo que desea y luego establecer un punto de interrupción en una línea específica:

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

DB<2> b 830 

DB<3> c 
+0

'f' no parece funcionar con' require' indica que el archivo no está cargado. – Morinar

+0

Tiene que cargar un archivo antes de poder establecer un punto de interrupción dentro de él, aunque puede hacer 'b load ' para interrumpir la carga de un archivo. –

+0

Cuando lo hago, nunca se rompe. – Morinar

0

Cómo sobre el uso del comando c para saltar más allá de la require sy luego establecer un punto de interrupción. Por ejemplo

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

Después de entrar al segundo archivo y luego intentar establecer un punto de interrupción en la línea, me dice que esa línea no es divisible. – Morinar

+0

@Morinar: solo puede establecer puntos de interrupción en líneas que son ejecutables. Para declaraciones de varias líneas, generalmente significa la primera línea de la expresión. –

+0

La línea que estoy tratando de establecer como punto de inflexión es una sola línea 'if'. Parece que no puedo establecer un punto de interrupción en CUALQUIER línea de ese archivo. Algo está mal aquí, pero no puedo entender qué. – Morinar

2

También puede editar C.pl añadiendo esto:

$DB:single = 1; 

y el depurador se detendrá después de ejecutar esa línea, y antes de ejecutar la siguiente línea. Esto es similar a la declaración de 'depurador' de Ruby.

Consulte también: perldoc DB

+0

Esto debería ser $ DB :: single = 1; La coma simple allí es la sintaxis incorrecta para abordar esta variable. – bradoaks

1

Yo prefiero el truco barato de la orden del depurador 'R' (reiniciar). Aquí está un ejemplo de programa:

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

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

y vamos a suponer que queremos romper al método LWP :: agente de usuario de nuevo().Haga lo siguiente:

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

carga el módulo que desea establecer el punto de interrupción en:

DB<1> use LWP::UserAgent 

impresión de su entrada @INC de averiguar qué archivo que acaba de cargar (tenía que hacer la 'f' comando):

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 

Cambiar a ese archivo con '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(); 

Queremos romper en la nueva(), por lo que resulta:

DB<4> /new 
20: sub new 

encontrar la primera instrucción ejecutable en la sub través de '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}; 

Establecer un punto de interrupción en esta línea:

DB<5> b 23 

Reiniciar el depurador:

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

Ejecuta el programa y rompes en el punto que deseas.

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> 

Esta técnica es particularmente útil para la depuración de problemas de importación(); puedes cargar el módulo que está teniendo problemas. establecer un punto de interrupción en la importación(), y luego reiniciar. El depurador se detendrá en la importación() del módulo que le interesa.

Cuestiones relacionadas