Perl 调试器教程:调试 Perl 程序的 10 个简单步骤

举报
Tiamo_T 发表于 2022/02/13 10:59:28 2022/02/13
【摘要】 在本文中,让我们了解一下如何使用Perl 调试器调试 perl 程序/脚本,它类似于调试 C 代码的 gdb 工具。 要调试 perl 程序,请使用“perl -d”调用 perl 调试器,如下所示。

在本文中,让我们了解一下如何使用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 $pattern;
13: print “Enter search string: “;
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. 使用 (c) 继续到下一个断点(或行号,或子程序)

DB<5> c
Enter search string: perl
main::find_files(./perl_debugger.pl:22):
22: my $pattern = shift;

8. 使用 (c) 继续向下到特定的行号

DB<5> c 36
main::find_files(./perl_debugger.pl:36):
36: return @list;

9. 使用 (p) 打印特定变量中的值

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 – 退出调试器模式。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。