MATLAB - 调试



调试有助于识别和修复代码中的错误或问题,确保程序正确运行。

在了解如何开始调试的详细信息之前,让我们列出 Matlab 程序中常见的错误类型。

  • 语法错误 - 这些错误是由于代码结构不正确引起的,例如缺少或不匹配的括号、逗号或分号。
  • 运行时错误 - 这些错误发生在代码执行期间,通常是由于诸如除以零或访问不存在的变量等问题引起的。
  • 逻辑错误 - 这些错误最棘手,因为它们不会触发错误消息,但会产生错误的结果。调试这些错误通常需要仔细检查算法的逻辑。

让我们详细了解 Matlab 中的调试。

使用 MATLAB 编辑器

MATLAB 的集成开发环境 (IDE) 包括 MATLAB 编辑器,它提供了许多功能来帮助调试 -

  • 语法高亮 - 它通过以不同的颜色显示代码元素来帮助您发现语法错误。
  • 代码折叠 - 整理您的代码以提高可读性和更轻松地进行调试。
  • 代码建议 - MATLAB 可以为函数和变量提供自动建议,减少打字错误。

以下是一些示例。

calculate and displaysum

语法高亮显示了代码中的问题,如上图所示。我在第 3 行错过了分号。它还提供了详细信息选项,单击它后您将看到以下内容 -

suggested action

单击“修复”按钮将在第 3 行添加一个现在缺少的分号。

让我们再举一个语法错误的例子 -

error message

这里在第 6 行,我错过了 fprintf() 的闭合括号。错误突出显示了出现的问题,如上图所示。

Matlab 中的断点

断点就像放置在 Matlab 代码中的标记,用于在标记点中断执行。当代码到达断点时,它会暂停,允许您检查变量、检查程序状态和分析代码的行为。

您可以如下添加断点 -

function call stack

单击您希望添加断点的行号。该行号将如上图所示突出显示。在右侧,您会看到“断点”部分,其中包含有关函数 calculateAndDisplaySum.m 的断点详细信息。

现在,当您调用函数 calculateAndDisplaySum 时,它将在执行期间在第 6 行停止。您可以检查断点之前的所有行号,以确保函数中的变量和逻辑是否给出正确的结果。

Matlab 中断点的暂停和检查

代码执行在断点处停止,允许您检查变量、检查其值并在命令窗口或“变量”面板中评估表达式。

以下是 Matlab 中的执行流程 -

breakpoints

sum result

当您将光标放在变量上时,它会显示函数中使用的变量的值,如上图所示。

断点处的操作

debugger

代码在断点处暂停后,您可以使用调试器控件(单步执行、步入、步出)逐行单步执行代码。

使用红色突出显示的“继续”按钮从断点恢复代码执行。

在 Matlab 中使用运行进行调试

要执行代码直到指定行然后暂停,请选择该行左侧的“运行到光标”按钮。如果所选行无法立即访问,则 Matlab 将继续运行代码,直到到达文件末尾或遇到断点。

示例

plotgraph

在调试过程中,“运行到此处”按钮将转换为“继续到此处”按钮。在函数和类中,仅在调试期间才能通过“继续到此处”按钮访问执行到特定行并暂停的功能。

当 Matlab 进入暂停状态时,会发生一些更改 -

  • 编辑器或实时编辑器选项卡中的“运行”按钮将转换为“继续”按钮。
  • 命令窗口提示符将变为 K>>,表示 Matlab 的调试模式,其中键盘控制。
  • Matlab 用绿色箭头标记暂停的行,并将其以绿色突出显示,以便于识别。
command window

Matlab 暂停的行将保持非活动状态,直到您选择继续执行代码。要恢复,只需单击“继续”按钮。然后,Matlab 将继续执行文件,直到到达其结尾或遇到断点。或者,您可以选择所需代码行左侧的“继续到此处”按钮以恢复到该点的执行。

一些有助于代码调试的有用方法

以下是一些可帮助您更有效地调试代码的实用技巧 -

使用 codeIssues() 方法

在 Matlab 中,codeIssues 是一个容器对象,其中包含代码分析器识别的问题信息。issues 变量用于存储或引用来自 codeIssues 对象的信息。

语法

issues = codeIssues  : this takes care of issues with code related to the current folder and returns codeIssues object.

issues = codeIssues(names) : Here you can specify the name of the folder or file name for which you wish to issue the code issues.

示例

在本例中,我们希望查看与 add.m 文件相关的问题。

issues = codeIssues("add.m")

执行后,您将获得以下输出 -

>> issues = codeIssues("add.m")

issues = 

   codeIssues with properties:
   
      Date: 01-Dec-2023 16:48:56
      Release: "R2023b"
      Files: "/MATLAB Drive/add.m"
      CodeAnalyzerConfiguration: "active"
      Issues: [0x10 table]
      SuppressedIssues: [0x11 table]
   
>> 

现在我们看到 add.m 文件没有任何问题。让我们犯一些错误,看看在使用 codeIssues() 方法时是否会显示相同的内容。

考虑 add.m 文件,其中第 2 行缺少分号,如下面的屏幕截图所示 -

semicolon missing

执行 issues = codeIssues("add.m") 后,在 Matlab 命令窗口中提供以下详细信息 -

codeissues

使用 checkcode() 方法

此方法显示给定文件名可能存在的问题。

语法

checkcode(filename) :  give the filename here for which you wish to see the code issues.

示例

checkcode 函数检查 Matlab 脚本文件 add.m 中是否存在潜在问题。

checkcode('add.m')

在 Matlab 命令窗口中执行后,您将获得以下输出 -

>> checkcode('add.m')
L 2 (C 12): Add a semicolon after the statement to hide the output (in a function).
广告