matlab dbstop if naninf - >递归限制和崩溃

时间:2010-07-19 14:17:54

标签: matlab dbstop

我在交互式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)或“标量赋值”的含义,这不应该打击吗?

1 个答案:

答案 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>>