在MATLAB中定制dbstop

在MATLAB中定制dbstop,matlab,debugging,Matlab,Debugging,是否可以将自定义的dbstop条件添加到Matlab中 最近,我发现自己在多个变量中存在越界值,跟踪第一次出现这种情况的一种方法是在更新这些值的每行上设置一个条件断点。然而,我希望有一个更简单的方法来做到这一点 我最近不得不找到一个NaN,这是因为: dbstop if naninf 因此,我希望有可能得到如下结果: dbstop if anything outside myBound 或 我当然愿意接受人们可能期望的性能冲击。如果使用编辑器,您可以将停止设置为正常,右键单击它,选择“设置/

是否可以将自定义的
dbstop
条件添加到Matlab中

最近,我发现自己在多个变量中存在越界值,跟踪第一次出现这种情况的一种方法是在更新这些值的每行上设置一个条件断点。然而,我希望有一个更简单的方法来做到这一点

我最近不得不找到一个
NaN
,这是因为:

dbstop if naninf
因此,我希望有可能得到如下结果:

dbstop if anything outside myBound


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

如果使用编辑器,您可以将停止设置为正常,右键单击它,选择“设置/修改条件”,然后输入条件(停止将从红色变为黄色)

在命令行中,可以使用

dbstop in file if expression
dbstop in file at location if expression

e.g.
dbstop in myFile at 200 if (~isempty(var) && var > 3)
如@LuisMendo所述


第二个选项可能更有用,因为第一个选项似乎只在文件开始时进行计算。换句话说,如果naninf检查整个文件中的某些值,则似乎不可能有与dbstop类似的通用表达式。

跳出框框思考-您可以编写一个类来保存变量。在那里,您可以有一个定制的setter,如果您违反边界,它将发出警告
dbstop if warning
就足够了。

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

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

clear all
for m = 1:10;
    k = 2*m
end
如果变量
k
超过值
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
现在,在运行上述操作(检查
testfile.m
的每一行是否都有黄色断点)之后,运行
testfile
并在其停止时检查值:


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

您不能只使用以下版本的
dbstop
dbstop in FILESPEC if EXPRESSION
?问题似乎是您需要为断点指定(每个)位置。如果不指定它,Matlab假设文件的第一行,我想我可以围绕这个1编写一个包装器。查找myVar的所有事件(或只选择所有行)2。在这些行上放置一个条件断点。如果naninf能跨文件和变量工作,那么它仍然不如
dbstop强大,但可能足够了。@DennisJaheruddin:您需要确保在断点出现时定义了
myVar
,因此您至少需要在第一次出现时进行regexp。“在200”是什么意思是什么意思?@user42459:这意味着在第200行,不接触代码和输入,这是可能的吗?我认为不调整代码,这是不可能的。需要重写
=
运算符。
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