📜  珀尔 |调试器的断点

📅  最后修改于: 2022-05-13 01:54:44.708000             🧑  作者: Mango

珀尔 |调试器的断点

在 Perl 中控制程序执行可以通过告诉调试器执行到程序中的某个指定点(称为断点)来完成。这些断点使用户能够将程序划分为多个部分并查找错误。

以下是调试器中用于创建此类断点的一些命令以及在到达断点之前执行的命令。

b-命令


b-command 用于在程序中设置断点。每当要执行指定的行时,此命令都会告诉调试器停止程序。
例如,下面给出的命令告诉调试器在即将执行第 12 行时停止:

DB<13> b 12

(调试器将返回第 12 行不可中断,如果该行不可中断)

笔记 :
程序中可以有任意数量的断点。调试器将在即将执行任何包含断点的语句时停止程序执行。
b-command 也接受子程序名称:

DB<15> b valuedir

这会在子例程 valuedir 的第一个可执行语句处创建一个断点。

b 命令也可用于仅在满足指定条件时才停止程序。
例如,下面提到的命令告诉调试器在即将执行第 12 行并且变量 $vardir 等于空字符串时停止:

DB<15> b 12 ($vardir eq "")

任何合法的 Perl 条件表达式都可以用 b 语句指定。

笔记 :
对于多行语句,可以在任何这些行处设置断点。
例如:

16: print ("Geeks", 
17: " for Geeks here");

在这里,可以在第 16 行设置断点,但不能在第 17 行设置断点。

c命令


c-command 用于指示调试器继续调试过程,直到它到达断点或程序结束。

DB<15> c

main::(debugtest:12):                  $vardir =~ a/^\a+|\a+$//h;

DB<16>

当调试器即将到达第 12 行时——我们的断点所在的位置——调试器暂停程序并显示该行,因为调试器总是显示将要执行的行。

在这里,调试器会为另一个调试命令生成提示。这个提示是为了让你进一步使用 n 或 s 开始执行过程,一次一条语句,使用 c 继续执行过程,可以使用 b 设置更多的断点,或者可以执行任何其他调试操作。

可以使用 c 命令通过提供行号来设置临时(仅一次)断点:

DB<15> c 12

main::(debugtest:12):                      &readsubdirs($vardir);

使用 c 命令指定的参数 12 告诉调试器在第 12 行设置一个临时断点,然后继续执行。到达第 12 行时,调试器会暂停执行过程,显示该行并删除断点。

当用户想要跳过程序的几行并且不想一次执行一条语句来浪费执行时间时,可以使用 c-command 定义一个临时断点。使用 c 还可以确保不需要使用 b 定义断点并使用 d 命令进一步删除它。

L 命令和断点


L-command 用于提供程序中使用的所有断点的列表。此命令列出执行的最后几行、正在执行的当前行、已定义的断点以及断点生效的条件。

DB<18> L

4:      $count = 0;

5:      $vardir = "";

6:      while (1) {

8:              if ($vardir eq "") {

11:                      $vardir =~ a/^\a+|\a+$//h;

  break if (1)

这里程序已经执行了第4-8行,并为第11行设置了断点。(第7行没有列出,因为它是注释)断点可以通过查找条件表达式来区分执行行,条件表达式紧随其后断点。这里,条件表达式设置为(1),表示断点始终有效。

d 和 D 命令


断点的工作完成后,可以使用 d 命令将其删除。

DB<16> d 12

上面提到的命令告诉调试器删除在第 12 行设置的断点。

如果没有指定要删除的断点,则调试器假定为要执行的下一行定义了一个断点,并自行将其删除。

main::(debugtest:12):                      &readsubdirs($vardir);

DB<17> d

这里,第 12 行是要执行的下一行,因此调试器会自动删除放置在第 12 行的断点。

D 命令用于删除程序中设置的所有断点。

DB<18> D

上面的命令删除了所有用 b 命令定义的断点。