Main Content

设置断点

自 R2021b 开始提供。取代设置断点 (R2021a) 和在实时编辑器中调试代码 (R2021a)。

设置断点会暂停 MATLAB® 程序的执行,以便您检查可能出现问题的值。您可以在编辑器或实时编辑器中以交互方式设置断点,也可以使用命令行窗口中的函数设置断点。

有三种类型的断点:

  • 标准

  • 条件

  • 错误

您可以只选择那些保存在特定位置(当前文件夹或搜索路径上的文件夹)的文件,在这些文件的可执行代码行处设置断点。您可以随时设置断点,无论 MATLAB 是处于闲置状态还是在忙于运行文件。

默认情况下,当 MATLAB 到达断点时,它会打开包含该断点的文件。要禁用此选项,请执行以下操作:

  1. 主页选项卡上,点击环境部分中的 预设

  2. 在预设项窗口中,选择 MATLAB > 编辑器/调试器

  3. 清除当 MATLAB 到达断点时自动打开文件选项,然后点击确定

标准断点

标准断点在文件的特定行暂停。要设置标准断点,请点击要设置断点的可执行代码行左侧的灰色区域。您也可以按 F12 键在当前行设置断点。如果您尝试在可执行代码行以外的行处设置断点,例如注释或空白行,则 MATLAB 会在下一个可执行代码处行设置断点。

plotRand script with a red breakpoint at line three

要以编程方式设置标准断点,请使用 dbstop 函数。例如,要在名为 plotRand.m 的文件的第 3 行添加断点,请键入:

dbstop in plotRand at 3

调试包含循环的文件时,应在循环内设置断点,以检查在循环的每个增量处的值。否则,如果只在循环开始时设置断点,则 MATLAB 只会在循环语句处暂停一次。例如,以下代码创建了一个包含 10 个 1 的数组,并使用 for 循环对数组中的第 2 项到第 6 项执行计算:

x = ones(1:10);

for n = 2:6
    x(n) = 2 * x(n-1);
end
要使 MATLAB 在 for 循环的每个增量处暂停(总共五次),请在第四行设置断点。

Script showing a for loop with a red standard breakpoint on the line inside the loop

条件断点

如果使用条件断点,MATLAB 只在满足指定条件时才在文件的指定行处暂停。例如,如果您想在循环中进行一些迭代后再检查结果,则可以使用条件断点。

要设置条件断点,请右键点击要设置断点的可执行代码行左侧的灰色区域,然后选择设置条件断点。如果该行上已存在断点,请选择设置/修改条件。在打开的对话框中,输入条件并点击确定。条件是任何返回逻辑标量值的有效 MATLAB 表达式。

运行代码时,MATLAB 会在运行该行之前评估条件。如果满足条件,MATLAB 将进入调试模式,并在该行暂停。例如,以下代码创建了一个包含 10 个 1 的数组,并使用 for 循环对数组中的第 2 项到第 6 项执行计算:

x = one(1:10)

for n = 2:6
    x(n) = 2 * x(n-1);
end

在第四行用条件 n >= 4 设置条件断点。当您运行代码时,MATLAB 会运行两次 for 循环,并在 n 等于 4 的条件下进行第三次迭代时在第 4 行暂停。如果继续运行代码,则当 n 等于 5 时,MATLAB 会在第四次迭代的第四行再次暂停,然后当 n 等于 6 时再次暂停。

Script with a for loop with an orange conditional breakpoint on the line inside the loop

您也可以使用 dbstop 函数以编程方式设置条件断点。例如,要在 myprogram.m 的第 6 行添加条件断点,请键入:

dbstop in myprogram at 6 if n>=4

错误断点

在编辑器中,如果 MATLAB 遇到问题,您可以将错误断点设置为让 MATLAB 暂停并进入调试模式。实时编辑器不支持设置错误断点。

与标准断点和条件断点不同的是,您不用在具体行或具体文件中设置错误断点。设置错误断点后,只要符合所指定的错误条件,MATLAB 便会在任意文件的任意行处暂停。MATLAB 随后会进入调试模式,打开包含错误的文件,并且在包含错误的行上会出现执行箭头。

要设置错误断点,请点击编辑器选项卡上的 运行 ,并从以下选项中进行选择:

  • 出现错误时暂停,即一遇到错误就暂停。

  • 出现警告时暂停,即一遇到警告就暂停。

  • 出现 NaN 或 Inf 时暂停,即在遇到 NaN(非数字)或 Inf(无限)值时暂停。

您也可以使用具有指定的 conditiondbstop 函数,以编程方式设置错误断点。例如,要一遇到错误就暂停执行,请键入:

dbstop if error
要在 try/catch 块的 try 部分内第一次发生运行时错误且消息 ID 为 MATLAB:ls:InputsMustBeStrings 时暂停执行,请键入:
dbstop if caught error MATLAB:ls:InputsMustBeStrings

匿名函数中的断点

您可以在包含匿名函数的 MATLAB 代码行中设置多个断点。您可以为行本身和行中的每个匿名函数设置一个断点。

要在包含匿名函数的行上设置断点,请点击该行左侧的灰色区域。MATLAB 为该行添加断点,并为该行中的每个匿名函数添加一个处于禁用状态的断点。要为匿名函数启用断点,请点击该函数处于禁用状态的断点。

要查看一行中所有断点的信息,请将光标放在断点图标上。随即会显示工具提示及可用信息。例如,在以下代码中,第 7 行包含两个匿名函数,每个匿名函数都有一个断点。

Script showing a line of code with two anonymous functions, with red breakpoints displayed on the line number and before each of the two anonymous functions. A tooltip displays information about the breakpoints.

当您在匿名函数中设置断点时,MATLAB 会在调用匿名函数时暂停。以绿色突出显示的代码行是代码定义匿名函数的位置。以灰色突出显示的代码行是代码调用匿名函数的位置。例如,在以下代码中,MATLAB 在为匿名函数 g 设置的断点处暂停程序,该函数在第 7 行定义,并在第 8 行调用。

Script showing a line of code with two anonymous functions. The line has a green arrow and green highlighting, indicating that MATLAB is paused at that line. The line below it is highlighted in gray, indicating that it is the line that called the anonymous functions.

无效断点

深灰色断点表示无效断点。

Script showing a dark gray, invalid breakpoint at line three

出现以下情况时,断点无效:

  • 文件中未保存的更改。保存该文件以使断点有效。灰色断点变为红色,表示它们现在变为有效了。

  • 文件中的语法错误。当您设置断点时,会显示一则错误消息,指示语法错误的位置。修复语法错误并保存文件以使断点有效。

禁用断点

您可以禁用所选断点以便让程序暂时忽略它们而不中断运行。例如,您可以在您认为发现并更正了问题后或使用条件断点时禁用断点。

要禁用断点,请右键点击断点图标,从上下文菜单中选择禁用断点

断点变为浅灰色,表示它已禁用。

Script showing a light gray, disabled breakpoint at line three

要重新启用断点,请右键点击断点图标,从上下文菜单中选择启用断点

灰色断点变为红色,程序执行在该行暂停。

要启用或禁用文件中的所有断点,请右键点击可执行文件行左侧的灰色区域,然后选择启用文件中的所有断点禁用文件中的所有断点。只有当至少有一个断点可供启用或禁用时,才能使用这些选项。

清除断点

所有断点都保留在文件中,直到您清除(删除)它们为止,或直到它们在您的 MATLAB 会话结束时自动被清除为止。

要清除断点,请右键点击断点图标,然后从上下文菜单中选择清除断点。您也可以按 F12 键清除断点。

要以编程方式清除断点,请使用 dbclear 函数。例如,要清除名为 myprogram.m 的文件中第 6 行处的断点,请键入:

 dbclear in myprogram at 6

要清除文件中的所有断点,请右键点击断点列,然后选择清除文件中的所有断点。您也可以使用 dbclear all 命令。例如,要在名为 myprogram.m 的文件中清除所有断点,请键入:

dbclear all in myprogram

要清除所有文件中的全部断点(包括错误断点),请右键点击断点列,然后选择清除全部断点。您也可以使用 dbclear all 命令。

在您终止 MATLAB 会话时,系统会自动清除断点。要保存断点以用于后续会话,请使用 dbstatus 函数。

相关主题