インタラクティブな 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 のように)、または「スカラー代入」とは何を意味するのでしょうか?