我在交互式MATLAB控制台中发出以下命令:
>> foo = [1 inf];
>> dbstop if naninf
>> foo
我现在得到了奇怪的行为:MATLAB似乎要分成两个不同的文件,但实际上并没有停止执行。这很慢,因为编辑器反复切换这两个文件,Ctrl + C不做任何事情。输出是:
481 end
20 if ~isfloat(value)
20 if ~isfloat(value)
399 if numel(var) > numelLimit
20 if ~isfloat(value)
20 if ~isfloat(value)
399 if numel(var) > numelLimit
20 if ~isfloat(value)
20 if ~isfloat(value)
399 if numel(var) > numelLimit
...
...
然后它终于通过调试提示停止,具有非常长(递归)的堆栈,如:
dbstack
In codetools/private/dataviewerhelper>upconvertIntegralType at 20
In codetools/private/dataviewerhelper at 9
In workspacefunc>createComplexScalar at 271
> In workspacefunc>num2complex at 241
In workspacefunc>getShortValueObjectJ at 230
In workspacefunc>getShortValueObjectsJ at 349
In workspacefunc at 21
In codetools/private/dataviewerhelper>upconvertIntegralType at 20
In codetools/private/dataviewerhelper at 9
In workspacefunc>createComplexScalar at 271
In workspacefunc>num2complex at 241
In workspacefunc>getShortValueObjectJ at 230
In workspacefunc>getShortValueObjectsJ at 349
In workspacefunc at 21
In workspacefunc>getStatObjectsJ at 399
In workspacefunc at 27
In codetools/private/dataviewerhelper>upconvertIntegralType at 20
In codetools/private/dataviewerhelper at 9
In workspacefunc>createComplexScalar at 271
In workspacefunc>num2complex at 241
In workspacefunc>getShortValueObjectJ at 230
In workspacefunc>getShortValueObjectsJ at 349
In workspacefunc at 21
In codetools/private/dataviewerhelper>upconvertIntegralType at 20
In codetools/private/dataviewerhelper at 9
In workspacefunc>createComplexScalar at 271
In workspacefunc>num2complex at 241
In workspacefunc>getShortValueObjectJ at 230
In workspacefunc>getShortValueObjectsJ at 349
In workspacefunc at 21
In workspacefunc>getStatObjectsJ at 399
In workspacefunc at 27
...
...
在我的实际程序中,我正在尝试调试,我得到相同但更糟糕的是,有时我遇到递归限制错误并中止,有时MATLAB只是完全崩溃。我真的希望能够使用dbstop if naninf
,但这使得它几乎不可能,这让我感到难过。有什么建议?
在Linux上使用MATLAB 2009b 64位。
谢谢!
修改:
我刚刚在MATLAB 2007b 32位Linux上尝试过它:
>> foo = [1 inf]
foo =
1 Inf
>> dbstop if naninf
>> foo
foo =
1 Inf
>> foo = [1 inf]
foo =
1 Inf
>>
>> t = foo(2)
t =
Inf
所以这里dbstop如果naninf在故意将inf分配给变量时似乎没有做任何事情。 The docs say:
dbstop如果naninf或dbstop如果infnan在您随后运行的任何MATLAB程序文件因操作符,函数调用而产生无限值(Inf)或非数字(NaN)的值时停止执行,或标量赋值,将MATLAB置于调试模式,在遇到Inf或NaN的行之后立即暂停。
即使我故意将一个inf分配给一个变量(如上面的t = foo(2)或s = inf)或“标量赋值”的含义,这不应该打击吗?
答案 0 :(得分:4)
当你试图在你的工作区中显示NaN或Inf值时,你看到的那个奇怪的深度递归断点看起来像是在Matlab GUI中实现了M-code实现的断点。 (这是在Matlab VM中运行的Matlab IDE的缺点之一以及用户代码。)我可以重现。尝试关闭桌面菜单中的工作区视图,或使用桌面>切换到最小布局。桌面布局>仅限命令窗口。
对于第二部分:直接在命令行输入的表达式不会触发断点。如果你把它扔进脚本或函数,你就会遇到断点。例如:
function repro_dbstop_naninf
foo = Inf;
foo = [1 Inf];
bar = foo(2);
disp('last line');
当你调用这个函数时,它会打破(实际上是第2行和第4行)。
>> dbstop if naninf
>> repro_dbstop_naninf
NaN/Inf breakpoint hit for repro_dbstop_naninf on line 2.
Stopping at next line.
2 foo = Inf;
3 foo = [1 Inf];
K>>