0

次のコードのように、無限再帰が発生すると Matlab がクラッシュする

ファイル: xm

function x
     y;
end

ファイル: ym

function y
     x;
end

ファイル: script.m

x;

スクリプト script.m が実行されると、matlab がクラッシュし、再起動する必要があります。

try-catch を使用しても、まだクラッシュします。

ファイル: script.m

try
x;
catch
    error('stack-overflow');
end

無限ループから除外されたこのようなクラッシュを処理する方法はありますか?

4

1 に答える 1

1

簡単なトリックとして、次のことができます。

global counter;
global RecursionDepth;
counter = 0;
RecursionDepth = 1000;

コードの最初のどこかで、次のことができます

function IncrementCounterAndCheckDepth()

    global counter;
    global RecursionDepth;
    counter = counter+1;
    if counter > RecursionDepth
    error('stack-overflow');
else
disp(RecursionDepth);
    end;
    return;

再帰をチェックするために必要なときはいつでも挿入してください。デバッグを改善するために、追加の情報を追加したり、いくつかの引数を渡したりすることもできます。デバッグが完了したら、すべてのグローバルを削除し、何もしないように IncrementCounterAndCheckDepth() を定義して、パフォーマンスに影響を与えず、デバッグすることができます。パフォーマンスに影響を与えることなく、多くの場所に挿入できます。追加のデバッグを行う必要がある場合は、この機能をオンに戻し、特定の問題を追跡するために必要に応じて変更します。コード内のどこにでもあることがわかります。

于 2013-01-06T17:32:47.560 に答える