Main Content

调试 MATLAB 代码文件

自 R2021b 开始提供。取代调试 MATLAB 程序 (R2021a) 和在实时编辑器中调试代码 (R2021a)。

您可以通过在编辑器和实时编辑器中以交互方式调试代码,或通过使用命令行窗口中的调试函数以编程方式调试代码,来诊断 MATLAB® 代码文件中的问题。

调试代码有几种方法:

  • 通过删除分号来显示输出。

  • 通过点击“运行到此行”按钮 将代码运行到特定行并暂停。

  • 通过点击“步入”按钮 在暂停状态下步入函数和脚本。

  • 将断点添加到文件中,以便在运行您的代码时在特定行暂停。

开始调试之前,为避免意外结果,请保存代码文件,并确保代码文件及其调用的任何文件存在于搜索路径或当前文件夹中。MATLAB 根据您调试的位置以不同方式处理未保存的更改:

  • 编辑器 - 如果文件包含未保存的更改,MATLAB 会在运行文件之前保存该文件。

  • 实时编辑器 - MATLAB 运行文件中的所有更改,无论是否保存了它们。

  • 命令行窗口 - 如果文件包含未保存的更改,MATLAB 运行文件的已保存版本。您看不到更改结果。

显示输出

确定 MATLAB 代码文件中出现问题的位置的一种方法是显示输出。要显示一行的输出,请删除该行末尾的分号。在编辑器中,MATLAB 在命令行窗口中显示输出。在实时编辑器中,MATLAB 随创建输出的代码行显示输出。

例如,假设您有名为 plotRand.m 的脚本,它绘制随机数据向量图,并在绘图中的均值处绘制一条水平线。

n = 50;
r = rand(n,1);
plot(r)

m = mean(r);
hold on
plot([0,n],[m,m])
hold off
title("Mean of Random Uniform Data")

要显示第二行 rand 函数的输出,请删除行尾的分号。MATLAB 在命令行窗口中显示 r 的值。

Command Window showing a call to the plotRand function followed by the resulting output, the value of r

在实时编辑器中,MATLAB 随第 2 行代码显示 r 的值。

plotRand live script with the semicolon removed from the end of line 2 and the resulting output, the value of r and the plot, displayed on the right

使用运行到此行进行调试

要在工作区中了解在代码中的特定点处所有变量的状态,请运行代码文件,然后暂停。要使代码运行到指定的行,然后暂停,请点击该行左侧的“运行到此行”按钮 。如果无法到达所选行,MATLAB 将继续运行,直到达文件末尾或遇到断点。

调试时,“运行到此行”按钮 变为“继续运行到此行”按钮 。在函数和类中,运行到指定行后暂停的功能仅在使用“继续运行到此行”按钮 进行调试时可用。在 R2021a 和以前的版本中,要在调试时运行到光标位置并暂停,请转至编辑器选项卡,然后点击“运行到光标处”按钮

例如,点击 plotRand.m 中第 2 行左侧的运行到此行按钮 。MATLAB 从第 1 行开始运行 plotRand.m 并在运行第 2 行之前暂停。

plotRand script with the Run to Here button visible in the left margin, next to the line number for line 2

当 MATLAB 暂停时,会发生多项变化:

  • 编辑器实时编辑器选项卡中的 运行按钮更改为 继续按钮。

  • 命令行窗口中的提示符将更改为 K>>,指示 MATLAB 处于调试模式且键盘受控制。

  • MATLAB 使用绿色箭头和绿色突出显示指示暂停的行。

    plotRand script with a green arrow and green highlighting on line 2, indicating that MATLAB is paused at line 2

提示

最好避免在 MATLAB 暂停时修改文件。在 MATLAB 暂停期间更改的代码不会运行,直至MATLAB 完成代码运行并重新运行代码,这些更改后的代码才会运行。

MATLAB 会停留在暂停执行的行,直到您继续运行代码为止。要继续运行代码,请点击 继续按钮。MATLAB 会继续运行该文件,直到到达文件末尾或断点。您也可以点击要继续运行到的代码行左侧的“继续运行到此行”按钮

要继续逐行运行代码,请在编辑器实时编辑器选项卡上点击 步进。MATLAB 会执行当前所在的行,然后在下一行暂停。

plotRand script with a green arrow and green highlighting on line 3, indicating that MATLAB is paused at line 3

在调试时查看变量值

要在 MATLAB 暂停时查看变量值,请将光标放在该变量上。该变量的当前值将显示在数据提示中。数据提示会一直在视图中,直到您移动光标。

plotRand script paused at line 2 with a data tip showing the size, data type, and value of the variable n

您也可以通过在命令行窗口中键入变量名称来查看变量的值。例如,要查看变量 n 的值,请键入 n 并按 Enter 键。命令行窗口会显示变量名及其值。要查看当前工作区中的所有变量,请使用工作区浏览器。

有关详细信息,请参阅调试时检验值

暂停运行文件

对于运行时间长的代码,您可以在它运行的中间暂停它,以检查进度并确保它按预期运行。要暂停运行代码,请转至编辑器实时编辑器选项卡并点击 暂停按钮。MATLAB 会在下一个可执行代码行处暂停,并且 暂停按钮会更改为 继续按钮。要继续运行代码,请按 继续按钮。

注意

当您点击 暂停按钮时,MATLAB 可能会在您自己的代码之外的文件中暂停。此外,在 MATLAB 暂停之前,您可能会注意到明显的延迟,并且 暂停按钮会变为 继续按钮。在某些情况下,MATLAB 可能根本不会暂停。原因是 MATLAB 在一些内置代码中无法暂停。

步入函数

调试时,您可以步入所调用的文件中,在要检查值的点暂停。要步入文件,请点击您要步入的函数或脚本左侧的“步入”按钮 。仅当该行包含对另一个函数或脚本的调用时,MATLAB 才会显示该按钮。步入后,点击文件顶部的“步出”按钮 以运行被调函数的其余部分,离开被调函数,然后暂停。

默认情况下,“步入”按钮 仅对用户定义的函数和脚本显示。要对所有函数和脚本也显示该按钮,请在主页选项卡的环境部分中,点击预设。然后,选择 MATLAB > 编辑器/调试器,在调试部分中,将显示内嵌 "步入" 按钮选项设置为始终。要从不显示该按钮,请将显示内联 "步入" 按钮选项设置为从不

您也可以使用编辑器实时编辑器选项卡上的 步入 步出按钮,在调试时步入和步出函数。这些按钮不遵循显示内嵌 "步入" 按钮预设项,并且始终可以步入和步出用户定义的函数和 MathWorks® 函数。

函数调用堆栈

当您步入被调函数或文件时,MATLAB 将显示在当前行暂停前执行的函数列表。该列表,也称为该函数调用堆栈显示在文件的顶部,按顺序显示各函数,最左侧是第一个调用的脚本或函数,最右侧是 MATLAB 暂停处的当前脚本或函数。

Function call stack for plotRand showing plotRand as the first called script and mean as the current function

对于函数调用堆栈中的每个函数,都有一个相应的工作区。工作区包含您在 MATLAB 中创建的变量或从数据文件或其他程序导入的变量。通过命令行窗口分配或使用脚本创建的变量属于基础工作区。在函数中创建的变量属于其自己的函数工作区。

您可以通过选择不同工作区来检查当前工作区之外的变量值。有关详细信息,请参阅调试时检验值

添加断点并运行代码

如果文件中存在您每次运行您的代码时都要暂停的代码行,请在这些行上添加断点。您可以使用编辑器和实时编辑器以交互方式添加断点,或在命令行窗口中使用函数以编程方式添加断点,或同时使用两种方式。

有三种类型的断点:标准、条件和错误。要在编辑器或实时编辑器中添加标准断点,请点击要设置断点的可执行代码行左侧的行号(如果行号不可见,则点击灰色区域)。例如,点击 plotRand.m 中的第 3 行以在该行添加断点。

plotRand script with a red breakpoint at line 3

运行文件时,MATLAB 会在由断点指示的代码行处暂停。MATLAB 会停留在暂停执行的行,直到您继续运行代码为止。

例如,在编辑器中打开 plotRand.m 文件的情况下,点击编辑器选项卡中的 运行按钮。MATLAB 从第 1 行开始运行 plotRand.m,并在运行第 3 行之前暂停。

当 MATLAB 暂停时,会发生多项变化:

  • 编辑器实时编辑器选项卡中的 运行按钮更改为 继续按钮。

  • 命令行窗口中的提示符将更改为 K>>,指示 MATLAB 处于调试模式且键盘受控制。

  • MATLAB 使用绿色箭头和绿色突出显示指示暂停的行。

    plotRand script with a breakpoint at line 3 and a green arrow and green highlighting on line 3, indicating that MATLAB is paused at line 3

提示

最好避免在 MATLAB 暂停时修改文件。在 MATLAB 暂停期间更改的代码不会运行,直至MATLAB 完成代码运行并重新运行代码,这些更改后的代码才会运行。

要继续运行代码,请点击 继续按钮。MATLAB 会继续运行该文件,直到到达文件末尾或断点。要继续逐行运行代码,请在编辑器实时编辑器选项卡上点击 步进。MATLAB 会执行当前所在的行,然后在下一行暂停。

有关不同类型断点以及如何设置、清除和禁用断点的详细信息,请参阅设置断点

结束调试会话

发现问题后,要结束调试会话,请转至编辑器实时编辑器选项卡,然后点击 停止。结束调试后,命令行窗口中正常的 >> 提示符会重新出现,取代 K>> 提示符。您也无法再访问该函数调用堆栈。

为避免混淆,请务必在每次完成调试时结束调试会话。如果在调试时对文件进行更改并保存,则 MATLAB 将结束调试会话。如果 MATLAB 暂停时变得无响应,请按 Ctrl+C 结束调试。

使用 MATLAB Online 中的调试器面板进行调试

MATLAB Online™ 中,您可以在调试时使用调试器面板来管理断点和导航函数调用堆栈。

默认情况下,当 MATLAB 进入调试模式时,调试器面板会自动打开。要手动打开调试器面板,请转至编辑器实时编辑器选项卡,在分析部分中,点击 调试器。您也可以使用边栏中的“打开更多面板”按钮 (three-dot icon) 来打开面板。默认情况下,调试器面板在桌面右侧打开。要隐藏调试器面板,请点击边栏中的调试器 图标。

Debugger panel showing a Breakpoints section and a Function call stack section. The Breakpoints section shows Pause on Errors selected, as well as three enabled breakpoints in the plotRand.m file. The Function call stack section shows that the debugger is paused at line 9 of plotRand.m. The Debugger icon is visible in the sidebar.

面板中的断点部分列出所有 MATLAB 代码文件中的断点。该部分中的前三个断点(出现错误时暂停出现警告时暂停返回 NaN 或 Inf 时暂停)是错误断点。当您启用这些断点之一时,如果发生指定的错误条件,MATLAB 将在任何文件的任一行上暂停。其余断点按文件分组。

对于列表中的每个断点,您可以执行以下操作:

  • 启用或禁用断点 - 选中断点旁边的复选框可启用该断点,清除复选框可禁用该断点。

  • 清除断点 - 选择断点,然后在调试器面板的顶部点击“清除”按钮 可清除该断点。要清除所有断点,请点击“清除”按钮 旁边的 drop-down arrow,然后选择清除所有断点。错误断点无法清除。

  • 转至文件中的断点 - 点击断点右侧的超链接行号可打开文件并转至包含该断点的代码行。

  • 设置或修改断点条件 - 右键点击断点并选择设置/修改条件可为所选断点输入或修改条件。

有关断点的详细信息,请参阅设置断点

函数调用堆栈部分显示在当前行暂停之前 MATLAB 执行的函数的列表。函数按顺序显示,其中 MATLAB 暂停的当前脚本或函数位于列表顶部,第一个调用的脚本或函数位于列表底部。对于函数调用堆栈中的每个函数,都有一个相应的工作区。要查看函数调用堆栈中某个函数的工作区,请在列表中选择该函数。有关函数调用堆栈的详细信息,请参阅函数调用堆栈

要禁止自动打开调试器面板,请点击调试器面板左上角的“调试器配置” 按钮,并清除自动打开调试器面板选项。您也可以在预设项窗口的 MATLAB > 编辑器/调试器页中禁用此选项。

使用键盘快捷方式或函数进行调试

您可以使用键盘快捷方式或在命令行窗口中使用函数来执行大多数调试操作。下表介绍了调试操作以及相关键盘快捷方式和可用于执行这些操作的函数。

操作描述键盘快捷方式函数

继续

继续运行文件,直到达文件末尾或遇到另一个断点。

F5

dbcont

步进

运行当前代码行。

F10

(在 macOS 系统上是 Shift+Command+O

dbstep

步入

运行当前代码行,如果该行包含对另一个函数的调用,则步入该函数。

F11

(在 macOS 系统上是 Shift+Command+I

dbstep in

步出

步入后,运行被调函数的其余部分,离开被调函数,然后暂停。

Shift+F11

(在 macOS 系统上是 Shift+Command+U

dbstep out

停止

结束调试会话。

Shift+F5

dbquit

设置断点

如果不存在断点,则在当前行设置断点。

F12

dbstop

清除断点

清除当前行的断点。

F12

dbclear

相关主题

外部网站