在MATLAB中自定义dbstop

Den*_*din 5 debugging matlab

是否可以dbstop为Matlab 添加自定义条件?

最近我发现自己在多个变量中有超出界限的值,追踪第一次出现的一种方法是在更新这些值的每一行上设置条件断点.但是,我希望有一种更简单的方法可以做到这一点.

我最近不得不追踪一个NaN相当微不足道的原因:

dbstop if naninf
Run Code Online (Sandbox Code Playgroud)

因此,我希望有可能得到类似的东西:

dbstop if anything outside myBound
Run Code Online (Sandbox Code Playgroud)

要么

dbstop if myVariable outside myBound
Run Code Online (Sandbox Code Playgroud)

我当然愿意接受人们可能期望的性能打击.

Lui*_*ndo 2

使用“DBSTOP in FILESPEC if EXPRESSION”形式的问题是它仅在文件的第一dbstop行设置断点。解决方案是使用“DBSTOP in FILESPEC at LINENO if EXPRESSION”形式在每一行设置断点。

考虑以下示例脚本,该脚本保存在名为testfile.m.

clear all
for m = 1:10;
    k = 2*m
end
Run Code Online (Sandbox Code Playgroud)

假设我们想要在变量k超过 value时停止6。我们首先在该文件的所有行中自动设置断点:

file = 'testfile.m';
varname = 'k';
expression = 'k>6'; %// it should be 'exist(''k'')&&k>6', but that's added later

%// Determine number of lines of file:
fid = fopen('testfile.m');
cont = 1;
nlines = 0;
while cont
    readline = fgetl(fid);
    cont = ~isequal(readline,-1);
    nlines = nlines + cont;
end
fclose(fid);

%// Set breakpoint at each line. We need eval for this
for n = 1:nlines
    eval(['dbstop in ' file ' at ' num2str(n) ' if ( exist(''' varname...
        ''') && ( ' expression ' ) )'])
end
Run Code Online (Sandbox Code Playgroud)

现在,运行上述代码后(检查每一行testfile.m都有一个黄色断点),运行testfile并在停止时检查值:

在此输入图像描述

如果您有多个变量或文件,这无疑有点麻烦。另外,我不确定 Matlab 支持多少个同时断点(我们为每个程序行使用一个断点)。