代码之家  ›  专栏  ›  技术社区  ›  Ben Schwehn

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

  •  1
  • Ben Schwehn  · 技术社区  · 14 年前

    我在交互式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
    ...
    ...
    

    dbstop if naninf 但这让我很不可能,这让我很难过。有什么建议吗?

    在Linux上使用matlab2009b64位。

    编辑:

    我刚刚在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如果在故意将inf赋给变量时,naninf似乎没有做任何事情。 The docs say:

    dbstop if naninf或dbstop if infnan在随后运行的任何MATLAB程序文件由于运算符、函数调用或标量赋值而产生无限值(Inf)或非数字值(NaN)时停止执行,使MATLAB处于调试模式,在遇到Inf或NaN的行后立即暂停。

    即使我故意将inf赋值给一个变量(如上面的t=foo(2)或s=inf)或者“标量赋值”是什么意思,这难道不应该发生吗?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Andrew Janke    14 年前

    你看到的那个奇怪的深度递归断点看起来像是在matlabgui中的断点,它本身是用M代码实现的,当它试图在你的工作区中显示NaN或Inf值时(这是在matlabvm中运行的matlabide的缺点之一,还有用户代码)。尝试关闭“桌面”菜单中的“工作区”视图,或使用“桌面”切换到最小布局>桌面布局>仅限命令窗口。

    对于第二部分:对于直接在命令行中输入的表达式,不会命中断点。如果你把它扔到脚本或函数中,你会碰到断点。例如:

    function repro_dbstop_naninf
    foo = Inf;
    foo = [1 Inf];
    bar = foo(2);
    disp('last line');
    

    当您调用这个函数时,它将在第2行和第4行中断(实际上是在第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>> 
    
    推荐文章