13.3 断点

在任何 m 文件函数中,都可以使用 dbstop 函数设置断点。

 
dbstop fcn
dbstop fcn line
dbstop fcn line1 line2
dbstop line1
dbstop in fcn
dbstop in fcn at line
dbstop in fcn at line if "condition"
dbstop in class at method
dbstop if event
dbstop if event ID
dbstop (bp_struct)
rline = dbstop (…)

为内置调试器设置断点。

fcn 是当前 path 上的函数名称。当已经处于调试模式时,可以省略 fcn 参数,将使用当前函数。子函数中的断点使用作用域操作符 ‘>’ 设置。例如,如果 file.m 有一个子函数 fcn2,则可以通过 file>fcn2 指定在 fcn2 中设置断点。

line 是要中断的行号。如果未指定 line,则默认为文件 fcn.m 中的第一个可执行行。可以在单个命令中指定多行;当使用函数语法时,这些行也可以作为单个向量参数传递([line1, line2, …])。

condition 是任何可以在断点处存在的代码上下文中求值的 Octave 表达式。遇到断点时,会对 condition 进行求值,如果 condition 为 true,则执行停止。如果 condition 无法求值(例如因为它引用了未定义的变量),则会抛出错误。具有副作用的表达式(如 y++ > 1)会改变变量,通常应避免。包含引号(‘"’、‘'’)或注释字符(‘#’、‘%’)的条件必须用引号括起来。(这不适用于从编辑器上下文菜单输入的条件。)例如:

dbstop in axis at 246 if 'any (opt == "x")'

指定 event 的形式不会在特定的函数和行号处设置断点。相反,它会在遇到某些意外事件时进入调试模式。可能的值为:

error

在报告错误时停止。这相当于同时指定 debug_on_error (true)debug_on_interrupt (true)

caught error

当 try-catch 块捕获到错误时停止(尚未实现)。

interrupt

当发生中断(Ctrl-C)时停止。

naninf

当代码返回非有限值时停止(尚未实现)。

warning

在报告警告时停止。这相当于指定 debug_on_warning (true)

事件 errorcaught errorwarning 都可以后跟一个指定错误 ID 或警告 ID 的字符串。如果这样做,只有具有指定 ID 的错误才会导致执行停止。要在一组 ID 中的任何一个上停止,必须发出多个 dbstop 命令。

断点和事件可以使用 dbclear 命令以相同的语法移除。

可以通过发出命令 bp_state = dbstatus; …; dbstop (bp_state) 来一次保存所有断点并恢复它们。

可选的输出 rline 是设置断点的实际行号。如果指定的行不可执行,这可能与指定的行不同。例如,如果在空行上尝试设置断点,Octave 会将实际断点设置在下一个可执行行。

当文件被重新解析时(例如在 GUI 外部修改了文件),文件中的所有断点都会被清除。

另请参阅: dbclear, dbstatus, dbstep, debug_on_error, debug_on_warning, debug_on_interrupt.

类方法中的断点也受支持(例如 dbstop ("@class/method"))。但是,不能在内置函数(如 sin 等)或动态加载的函数(即 oct 文件)中设置断点。

要在进入函数后立即设置断点,请使用行号 1,或完全省略行号,只给出函数名。设置断点时,Octave 会忽略前导注释块,断点将设置在函数中的第一条可执行语句上。例如:

dbstop ("asind", 1)
⇒   29

请注意,返回值 29 表示断点被有效设置在第 29 行。断点的状态可以通过 dbstatus 函数查询。

 
dbstatus
dbstatus ()
dbstatus ("fcn")
bp_list = dbstatus (…)

报告函数 fcn 中当前设置的断点。

使用参数调用时,返回一个包含函数 fcn 中断点行号的向量。如果不带参数调用,则报告所有已定义的断点。如果未设置断点,则返回空矩阵 ‘[]’。

如果使用输出参数调用,则返回一个结构体数组。每个元素都有一个变量 name,用于保存函数名、子函数名或类名(作为字符串)。还有变量 file,用于保存文件名的完整路径。如果输出参数是类方法,则还有一个变量 method,用于保存方法名。此外,变量 line 保存该函数中设置的断点行号向量。变量 cond 保存条件断点的字符串条件。如果设置了事件断点,则结构体元素还将具有 event 和可能的 identifier 字段。

输出结构体可以用作 dbstop 的输入。

另请参阅: dbstop, dbclear, dbwhere.

使用 dbclear 函数删除断点。

 
dbclear fcn
dbclear fcn line1 line2
dbclear fcn line1 line2
dbclear all
dbclear in fcn
dbclear in fcn at line1
dbclear in fcn at line1 line2
dbclear if event
dbclear if event ID
dbclear ("fcn", line)
dbclear ("fcn", line1, line2, …)
dbclear ("fcn", line1, …)
dbclear (line, …)
dbclear ("all")

删除函数 fcn 中行号 line 处的断点。

参数如下:

fcn

作为字符串变量的函数名。当已经处于调试模式时,可以省略此参数,将使用当前函数。

line

要删除断点的行号。多行可以作为单独的参数或作为向量给出。

event

一个事件,例如 errorinterruptwarning(详情请参见 dbstop)。

当在没有指定行号的情况下调用时,指定函数中的所有断点都会被清除。

如果请求的行不是断点,则不执行任何操作。

特殊关键字 "all" 将清除所有文件中的所有断点。

另请参阅: dbstop, dbstatus, dbwhere.

也可以在子函数中设置断点。例如,如果一个文件包含以下函数:

function y = func1 (x)
  y = func2 (x);
endfunction
function y = func2 (x)
  y = x + 1;
endfunction

则可以直接在子函数的开头设置断点:

dbstop func1>func2
⇒  5

请注意,‘>’ 是区分子函数与包含它们的 m 文件的字符。

在 Octave 脚本中设置断点的另一种简单方法是使用 keyboard 函数。

 
keyboard ()
keyboard ("prompt")

停止 m 文件执行并进入调试模式。

keyboard 函数执行时,Octave 会打印一个提示符并等待用户输入。然后对输入的字符串进行求值并打印结果。这样可以检查函数中变量的值,并在必要时赋予新值。要离开提示符并返回正常执行,请键入 ‘return’ 或 ‘dbcont’。keyboard 函数不返回退出状态。

如果 keyboard 没有参数地调用,将使用默认提示符 ‘debug> ’。

另请参阅: dbstop, dbcont, dbquit.

keyboard 函数被放置在脚本中用户希望停止执行的位置。它会自动将正在运行的脚本设置为调试模式。


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4