0

我在使用 CPAN 时遇到错误,并且由于输出相当无用,因此求助于调试。

$ perl -d /usr/bin/cpan CPAN

Loading DB routines from perl5db.pl version 1.33
<...>
main::(/usr/bin/cpan:2):            eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
main::(/usr/bin/cpan:3):                if $running_under_some_shell;
  DB<1> b /usr/lib/perl5/5.14/HTTP/Tiny.pm:125
  DB<2> L
/usr/bin/cpan:
 2:         eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
   break if (/usr/lib/perl5/5.14/HTTP/Tiny.pm:125)
  DB<2> c

之后c,程序运行完成,忽略断点。

/usr/lib/perl5/5.14/HTTP/Tiny.pm:125是以下行,在任何条件块之外。

my $request = {
    method    => $method,
    scheme    => $scheme,
    host_port => ($port == $DefaultPort{$scheme} ? $host : "$host:$port"),
    uri       => $path_query,
    headers   => {},
};

在第 142 行设置中断(这会导致我正在调试的错误)没有任何区别。

L输出来看,断点似乎设置在当前行上,而不是我需要的那个。但是,perldebug列为b file:line有效语法。

4

1 回答 1

1

该语法可能是一个较新的添加,我也无法让它在这里工作。我在 Unix 上有 5.8.8,在 Windows 上有 5.10.1,两者似乎都不起作用。我像您一样在当前行上获得断点(它将整个字符串视为条件)。

我建议使用下面的另一种语法。

打破方法:

b HTTP::Tiny::some_method

选择文件,换行(它匹配路径,而不是模块名称空间):

f HTTP/Tiny
b 125

如果它们在运行时使用 require 或 eval 加载,调试器将不知道该模块,因此您只需use HTTP::Tiny先键入调试器以强制加载它。

于 2015-10-07T23:56:04.430 回答