2010-06-11 2 views
5

J'ai un script Perl, nous allons l'appeler A.pl où les deux premières lignes ressemblent à ceci:Comment vous cassez sur une ligne spécifique d'un fichier requis dans le débogueur Perl?

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

Lorsque les deux B.pl et C.pl ont chacun leur propre cavalcade de l'exige. Je dois définir un point d'arrêt sur une ligne spécifique de C.pl. En GDB je ferais quelque chose comme:

b C.pl:830 

Cependant cela ne semble pas fonctionner du tout ici. C'est possible? Suis-je proche?

+0

Je n'ai jamais été capable de comprendre cela. Aller à accepter la réponse upvoted juste pour que cette question ne soit pas laissée sans réponse. – Morinar

Répondre

1

Vous ne pouvez pas le faire en une seule étape, mais vous pouvez modifier le fichier que vous voulez et ensuite définir un point d'arrêt sur une ligne spécifique:

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

DB<2> b 830 

DB<3> c 
+0

'f' ne semble pas fonctionner avec' require' indique que le fichier n'est pas chargé. – Morinar

+0

Vous devez charger un fichier avant de pouvoir définir un point d'arrêt à l'intérieur, bien que vous puissiez faire 'b charger ' pour ne pas charger un fichier. –

+0

Quand je fais ça, ça ne se casse jamais du tout. – Morinar

0

Comment l'utilisation de la commande c pour ignorer la require s puis en définissant un point d'arrêt. Par exemple

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

Après avoir entré dans le deuxième fichier, puis essayer de définir un point d'arrêt sur la ligne, il me dit que cette ligne n'est pas cassable. – Morinar

+0

@Morinar: Vous ne pouvez définir des points d'arrêt que sur des lignes exécutables. Pour les instructions multilignes, cela signifie généralement la première ligne de l'expression. –

+0

La ligne que j'essaie de définir un point d'arrêt est une ligne unique 'if'. Je n'arrive pas à définir un point d'arrêt sur N'IMPORTE QUELLE ligne de ce fichier. Quelque chose ne va pas ici, mais je n'arrive pas à comprendre quoi. – Morinar

2

Vous pouvez également modifier C.pl ajouter ceci:

$DB:single = 1; 

et le débogueur arrête juste après l'exécution de cette ligne, et avant d'exécuter la ligne suivante. Ceci est similaire à la déclaration de débogueur de Ruby.

Voir aussi: perldoc DB

+0

Cela devrait être $ DB :: single = 1; Le seul deux-points il y a une syntaxe incorrecte pour adresser cette variable. – bradoaks

1

Je préfère le truc pas cher de commande 'R' (redémarrage) du débogueur. Voici un exemple de programme:

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

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

et supposons que nous voulons briser à la méthode nouvelle() de LWP :: UserAgent.Pour ce faire:

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

Chargez le module que vous souhaitez définir le point d'arrêt dans:

DB<1> use LWP::UserAgent 

Imprimer son entrée @INC pour savoir ce que votre fichier vient d'être chargé (besoin de faire la commande « 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 

basculer vers ce fichier avec '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(); 

Nous voulons briser dans la nouvelle(), trouver il:

DB<4> /new 
20: sub new 

Trouver la première instruction exécutable dans la sous via '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}; 

Définir un point d'arrêt sur cette ligne:

DB<5> b 23 

Redémarrez le débogueur:

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

Exécutez le programme et vous cassez au point voulu. Cette technique est particulièrement utile pour le débogage de problèmes import(); vous pouvez charger le module qui rencontre des problèmes. Définissez un point d'arrêt dans import(), puis redémarrez. Le débogueur s'arrêtera dans import() pour le module qui vous intéresse.

Questions connexes