当无限递归发生时处理崩溃



当无限递归发生时Matlab崩溃,如下面的代码

文件: x.m

function x
     y;
end

文件: y.m

function y
     x;
end

文件: script.m

x;

如果脚本脚本。M执行matlab崩溃,必须重新启动。

即使我使用了try-catch,它仍然会崩溃:

文件:脚本。m

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

是否有办法处理这种从无限循环中省略的崩溃?

作为一个快速技巧,您可以执行

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()不做任何事情,所以性能不会受到影响,并且为了调试,它可以插入很多地方而不会影响性能。如果需要进行额外的调试,只需重新打开此函数并根据需要修改它以跟踪特定问题—您知道它在代码中无处不在。

最新更新