Skip to content

MATLAB - 调试

调试是查找和修复代码中错误(或称“bug”)的系统过程。现代 MATLAB 提供了一套强大且集成的工具,使这一过程高效直观。掌握这些工具对于编写健壮和正确的程序至关重要。

错误通常分为三类:

  • 语法错误:语言语法中的错误,例如缺少括号或关键字。MATLAB 编辑器在你运行代码之前就能捕获其中大部分错误。
  • 运行时错误:代码运行时发生的错误,例如尝试访问不存在的数组元素或除以零。这些错误会导致程序崩溃。
  • 逻辑错误:最具挑战性的一类。代码运行不会崩溃,但由于算法或逻辑缺陷而产生不正确的结果。

步骤 1:使用编辑器和代码分析器进行主动调试

Section titled “步骤 1:使用编辑器和代码分析器进行主动调试”

你的第一道防线是 MATLAB 编辑器本身。在你输入时,集成的代码分析器会持续扫描你的代码以查找问题。

  • 语法错误:用红色下划线和右侧指示条上的红色方块标记。将鼠标悬停在下划线上会提供错误描述。
  • 警告和改进:用橙色下划线和橙色方块标记。这些不是致命错误,但会突出显示潜在的 bug、性能问题或偏离最佳实践(例如,创建但从未使用过的变量)。

最佳实践:注意指示条。如果它不是绿色,请在运行代码之前调查警告和错误。这种主动方法能节省大量时间。

步骤 2:使用断点进行交互式调试

Section titled “步骤 2:使用断点进行交互式调试”

当发生逻辑错误时,你需要检查程序运行时的状态。断点是暂停在特定行执行的标记,赋予你完全的控制权。

要设置断点,请在编辑器的行号左侧灰色边栏中单击。将出现一个红色圆圈。当你运行代码时,执行将在该行执行之前停止。

暂停时:

  • 命令行提示符从 >> 变为 K>>,表明你处于调试模式。
  • 一个绿色箭头指向下一行要执行的代码。
  • 你可以通过将鼠标悬停在编辑器中的变量上来检查它们的值,或者查看“工作区”(Workspace)面板。

一旦暂停,编辑器选项卡功能区中会出现一组新的控件:

  • 继续:恢复执行,直到程序结束或遇到下一个断点。
  • 单步:执行当前行,然后在下一行再次暂停。
  • 步入:如果当前行是函数调用,此操作会将调试器步入该函数内部,允许你逐行调试它。
  • 步出:如果你在一个函数内部,此操作将执行函数剩余部分,并在原始函数调用后的行暂停。
  • 停止:完全终止程序执行。

如果错误在多次迭代后的循环内部发生,你不会想逐个单步执行。右键单击断点以设置条件,例如 i > 950。代码将仅在该条件为真时暂停。

你可以指示 MATLAB 在发生任何错误时自动进入调试模式。这对于查找运行时错误的精确位置非常有用。

% 在命令行窗口中输入这些命令
% 如果发生任何运行时错误,暂停执行
dbstop if error
% 如果发出警告,暂停
dbstop if warning
% 稍后关闭它们
dbclear if error

步骤 4:使用 try/catch 进行优雅的错误处理

Section titled “步骤 4:使用 try/catch 进行优雅的错误处理”

对于生产代码,你不希望你的程序崩溃。你可以使用 try/catch 块来预测并处理潜在错误。

try
% 可能导致错误的代码
data = readmatrix('non_existent_file.csv');
disp('File read successfully!');
catch ME
% 此块仅在 'try' 块中发生错误时运行
warning('Could not read the file. Using default values instead.');
fprintf('Error was: %s\n', ME.message); % 显示错误消息
data = [1, 2, 3]; % 分配一个默认值
end
disp('Program continues...');

MATLAB 提供了以编程方式检查代码问题的函数,这对于自动化测试和 CI/CD 管道非常有用。

checkcode 函数分析文件并直接在命令行窗口中显示潜在问题的报告。

% 假设 'my_script.m' 有一行类似于 'x = 5',但没有分号
checkcode('my_script.m')

输出将类似于:

L 3 (C 5): Add a semicolon after the statement to hide the output (in a function).