跳转至

Perl |调试器的断点

原文:https://www . geesforgeks . org/perl-调试器的断点/

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

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

b-Command

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

DB<13> b 1213>

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

注意: 一个程序中可以有任意数量的断点。每当调试器要执行任何包含断点的语句时,它都会暂停程序的执行。 b 命令也接受子程序名称:

DB<15> b valuedir15>

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

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

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

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

注意: 对于多行语句,可以在任意一行设置断点。 例如:

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

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

The c-Command

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

DB<15> c

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

DB<16>16>15>

当调试器即将到达第 12 行(在这里设置了断点)时,调试器会停止程序并显示该行,因为调试器始终显示即将执行的行。

这里,调试器为另一个调试命令生成一个提示。此提示使您能够进一步使用 n 或 s 一次启动一条语句的执行过程,使用 c 继续执行过程,使用 b 设置更多断点,或者执行任何其他调试操作。

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

DB<15> c 12

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

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

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

The L Command and Breakpoints

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

DB<18> L

4:      $count = 0;

5:      $vardir = "";

6:      while (1) {

8:              if ($vardir eq "") {

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

  break if (1)18>

这里,程序已经执行了第 4-8 行,并且为第 11 行设置了断点。(第 7 行没有列出,因为它是一个注释)断点可以通过查找紧接在断点之后的条件表达式来与已执行的行区分开来。这里,条件表达式被设置为(1),这表明断点总是有效的。

The d and D Commands

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

DB<16> d 1216>

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

如果未指定要删除断点,调试器将假定为要执行的下一行定义了断点,并自行删除它。

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

DB<17> d17>

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

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

DB<18> D18>

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



回到顶部