在本文中,让我们了解一下如何使用Perl 调试器调试 perl 程序/脚本,它类似于调试 C 代码的 gdb 工具。
要调试 perl 程序,请使用“perl -d”调用 perl 调试器,如下所示。
# perl -d ./perl_debugger.pl
要详细了解 perl 调试器命令,让我们创建以下示例 perl 程序 (perl_debugger.pl)。
$ cat perl_debugger.pl
#!/usr/bin/perl -w
# Script to list out the filenames (in the pwd) that contains specific pattern.
#Enabling slurp mode
$/=undef;
# Function : get_pattern
# Description : to get the pattern to be matched in files.
sub get_pattern
{
my $pattern;
print "Enter search string: ";
chomp ($pattern = <> );
return $pattern;
}
# Function : find_files
# Description : to get list of filenames that contains the input pattern.
sub find_files
{
my $pattern = shift;
my (@files,@list,$file);
# using glob, obtaining the filenames,
@files = <./*>;
# taking out the filenames that contains pattern.
@list = grep {
$file = $_;
open $FH,"$file";
@lines = <$FH>;
$count = grep { /$pattern/ } @lines;
$file if($count);
} @files;
return @list;
}
# to obtain the pattern from STDIN
$pattern = get_pattern();
# to find-out the list of filenames which has the input pattern.
@list = find_files($pattern);
print join "\n",@list;
1.进入Perl调试器
# perl -d ./perl_debugger.pl
it prompts,
DB<1>
2.使用(l)查看特定的行或子程序语句
DB<1> l 10
10: my $pattern;
DB<2> l get_pattern
11 {
12: my
p
a
t
t
e
r
n
;
13
:
p
r
i
n
t
“
E
n
t
e
r
s
e
a
r
c
h
s
t
r
i
n
g
:
“
;
14
:
c
h
o
m
p
(
pattern; 13: print “Enter search string: “; 14: chomp (
pattern;13:print“Entersearchstring:“;14:chomp(pattern = );
15: return $pattern;
16 }
3. 使用 (b) 在 get_pattern 函数上设置断点
DB<3> b find_files
4. 使用 (b) 在特定行设置断点
DB<4> b 44
5. 使用 (L) 查看断点
DB<5> L
./perl_debugger.pl:
22: my $pattern = shift;
break if (1)
44: print join “\n”,@list;
break if (1)
6. 使用 (s 和 n) 逐步执行
DB<5> s
main:😦./perl_debugger.pl:39): $pattern = get_pattern();
DB<5> s
main::get_pattern(./perl_debugger.pl:12):
12: my $pattern;
选项 s 和 n 逐步执行每个语句。选项 s 进入子程序。选项 n 单步执行子例程(越过)。
s 选项确实单步执行子程序,而 n 选项将执行子程序(越过)。
7. 使用 © 继续到下一个断点(或行号,或子程序)
DB<5> c
Enter search string: perl
main::find_files(./perl_debugger.pl:22):
22: my $pattern = shift;
8. 使用 © 继续向下到特定的行号
DB<5> c 36
main::find_files(./perl_debugger.pl:36):
36: return @list;
9. 使用 § 打印特定变量中的值
DB<6> p $pattern
perl
DB<7> c
main:😦./perl_debugger.pl:44): print join “\n”,@list;
DB<7> c
./perl_debugger.pl
调试程序终止。使用 q 退出或使用 R 重新启动,
使用 o inhibitor_exit 避免在程序终止后停止,使用
hq、h R 或 ho 获取更多信息。
在最后一次继续操作之后,输出在标准输出上打印为“./perl_debugger.pl”,因为它与模式“perl”匹配。
10. 从文件中获取调试命令(源码)
Perl 调试器可以从文件中获取调试命令并执行它。例如,使用 perl 调试命令创建名为“debug_cmds”的文件:
c
p $pattern
q
请注意,R 用于重新启动操作(无需退出并重新启动调试器)。
DB<7> R
DB<7> source debug_cmds
>> c
Enter search string: perl
./perl_debugger.pl
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
>> p $pattern
perl
>> q
perl 调试器命令总结
进入 perl 调试器后,可以使用以下选项。
- h 或 hh – 帮助页面
- c – 从当前执行继续向下直到断点,否则直到子例程名称或行号,
- p - 显示变量的值,
- b – 放置断点,
- L – 查看设置的断点,
- d – 删除断点,
- s - 进入下一行执行。
- n - 跳过下一行执行,因此如果下一行是子程序调用,它将执行子程序但不会进入它进行检查。
- source file – 从文件中获取调试命令。
- l subname – 查看子例程中可用的执行语句。
- q – 退出调试器模式。