1

インタラクティブな MATLAB コンソールで次のコマンドを発行します。

>> foo = [1 inf];
>> dbstop if naninf
>> foo

MATLAB は 2 つの異なるファイルに分かれているように見えますが、実際には実行を停止しません。エディターがこれら 2 つのファイルを繰り返し切り替えるため、これはかなり遅く、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 if naninf 意図的に変数に inf を割り当てるときに何もしないようです。ドキュメントは言う:

dbstop if naninf または dbstop if infnan は、後で実行する MATLAB プログラム ファイルが、演算子、関数呼び出し、またはスカラー代入の結果として無限値 (Inf) または数値ではない値 (NaN) を生成した場合に実行を停止します。デバッグ モードの MATLAB。Inf または NaN が検出された行の直後で一時停止。

意図的に inf を変数に代入した場合でも (上記の t = foo(2) または s = inf のように)、または「スカラー代入」とは何を意味するのでしょうか?

4

1 に答える 1

4

ワークスペースに NaN または Inf 値を表示しようとしているときに、M コードに実装されている Matlab GUI の一部でブレークポイントにヒットしているように見えます。(これは、ユーザー コードと共に Matlab VM で実行される Matlab IDE の欠点の 1 つです。) 再現できます。[デスクトップ] メニューでワークスペース ビューをオフにするか、[デスクトップ] > [デスクトップ レイアウト] > [コマンド ウィンドウのみ] で最小限のレイアウトに切り替えてみてください。

2 番目の部分: コマンド ラインに直接入力された式のブレークポイントはヒットしません。スクリプトまたは関数でスローすると、ブレークポイントにヒットします。例えば:

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>> 
于 2010-07-19T16:21:50.483 に答える