perl - 在 Perl 调试器中,如何在所需文件的特定行上中断?

标签 perl debugging

我有一个 Perl 脚本,我们称之为 A.pl前两行看起来像这样:

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

其中B.plC.pl每个人都有自己的需求行列。我需要在 C.pl 的特定行上设置断点.在 GDB 中,我会做类似的事情:
b C.pl:830

然而,这似乎根本不起作用。是否可以?我接近了吗?

最佳答案

我更喜欢调试器的“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();

加载要设置断点的模块:
  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' 找到 sub 中的第一个可执行语句:
  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() 中停止。

关于perl - 在 Perl 调试器中,如何在所需文件的特定行上中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026311/

相关文章:

perl - 如何在没有 root 访问权限的情况下在本地安装 CPAN 模块(DynaLoader.pm 第 229 行错误)?

mysql - 在 Windows 中安装 perl DBI-mysql 的问题

perl - 如何防止 perl dancer 应用程序中一条路线的序列化?

c# - Visual Studio 丢失/移动了我的断点

php - 如何让 PHP 将我的其他页面正确打印到 iframe 中?

perl - 搜索文件,当找到匹配时,存储它,然后打印出上面 4 行,下面 3 行

perl - Perl 什么时候强加字符串上下文?

linux - 如何调试在引导期间卡住的 Linux 内核?

debugging - vscode调试器配置: cwd

调试未启动的程序