在任何 m 文件函数中,都可以使用 dbstop 函数设置断点。
fcn ¶fcn line ¶fcn line1 line2 … ¶line1 … ¶in fcn ¶in fcn at line ¶in fcn at line if "condition" ¶in class at method ¶if event ¶if event ID ¶(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)。
事件 error、caught error 和 warning 都可以后跟一个指定错误 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 函数查询。
() ¶("fcn") ¶bp_list = dbstatus (…) ¶报告函数 fcn 中当前设置的断点。
使用参数调用时,返回一个包含函数 fcn 中断点行号的向量。如果不带参数调用,则报告所有已定义的断点。如果未设置断点,则返回空矩阵 ‘[]’。
如果使用输出参数调用,则返回一个结构体数组。每个元素都有一个变量 name,用于保存函数名、子函数名或类名(作为字符串)。还有变量 file,用于保存文件名的完整路径。如果输出参数是类方法,则还有一个变量 method,用于保存方法名。此外,变量 line 保存该函数中设置的断点行号向量。变量 cond 保存条件断点的字符串条件。如果设置了事件断点,则结构体元素还将具有 event 和可能的 identifier 字段。
输出结构体可以用作 dbstop 的输入。
使用 dbclear 函数删除断点。
fcn ¶fcn line1 line2 ¶fcn line1 line2 … ¶all ¶in fcn ¶in fcn at line1 ¶in fcn at line1 line2 … ¶if event ¶if event ID ¶("fcn", line) ¶("fcn", line1, line2, …) ¶("fcn", line1, …) ¶(line, …) ¶("all") ¶删除函数 fcn 中行号 line 处的断点。
参数如下:
作为字符串变量的函数名。当已经处于调试模式时,可以省略此参数,将使用当前函数。
要删除断点的行号。多行可以作为单独的参数或作为向量给出。
一个事件,例如 error、interrupt 或 warning(详情请参见 dbstop)。
当在没有指定行号的情况下调用时,指定函数中的所有断点都会被清除。
如果请求的行不是断点,则不执行任何操作。
特殊关键字 "all" 将清除所有文件中的所有断点。
也可以在子函数中设置断点。例如,如果一个文件包含以下函数:
function y = func1 (x) y = func2 (x); endfunction function y = func2 (x) y = x + 1; endfunction
则可以直接在子函数的开头设置断点:
dbstop func1>func2 ⇒ 5
请注意,‘>’ 是区分子函数与包含它们的 m 文件的字符。
在 Octave 脚本中设置断点的另一种简单方法是使用 keyboard 函数。
() ¶("prompt") ¶停止 m 文件执行并进入调试模式。
当 keyboard 函数执行时,Octave 会打印一个提示符并等待用户输入。然后对输入的字符串进行求值并打印结果。这样可以检查函数中变量的值,并在必要时赋予新值。要离开提示符并返回正常执行,请键入 ‘return’ 或 ‘dbcont’。keyboard 函数不返回退出状态。
如果 keyboard 没有参数地调用,将使用默认提示符 ‘debug> ’。
keyboard 函数被放置在脚本中用户希望停止执行的位置。它会自动将正在运行的脚本设置为调试模式。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4