如果出现错误,请保持Matlab在dbstop期间不要插入内置函数

时间:2017-01-03 16:24:06

标签: matlab debugging

在Matlab工作时,我经常使用dbstop error。很大一部分时间,一个错误导致错误被抛出内置的[m-file]函数内部,然后导致Matlab停止执行并打开文件。但是,调试内置文件内部几乎没有任何帮助,因此最终会破坏我的工作流程。可能有办法设置,以便Matlab退出调试器中的内置文件(从不打开它),让我在函数调用中?

2 个答案:

答案 0 :(得分:4)

虽然我从来没有找到解决此问题正确的方法,但是很容易将解决方法整合在一起:

  1. 创建一个包含以下内容的脚本:

    S = dbstack();
    
    file_paths  = cellfun(@which, {S.file}, 'UniformOutput', false);
    builtins    = ~cellfun('isempty', strfind(file_paths, matlabroot()));
    stack_depth = find(~builtins, 1, 'first');
    
    for ii = 1:stack_depth-1
        dbup(); end
    
  2. 将它保存在对您有意义的地方,然后放置shortcut to it in the MATLAB toolbar

  3. 然后,每当出现此问题时,您只需单击您的小快捷方式,它将自动转到调试堆栈中的第一个非内置函数。

答案 1 :(得分:0)

基于来自Mathworks的Rody's答案和反馈,这是您在此时可以获得的最接近的结果(R2016b):

S = dbstack('-completenames');

builtins    = ~cellfun('isempty', strfind({S(:).file}, matlabroot()));
stack_depth = find(~builtins, 1, 'first');

hDocument = matlab.desktop.editor.findOpenDocument(S(1).file);
matlab.desktop.editor.openAndGoToLine(S(stack_depth).file,S(stack_depth).line);
hDocument.close();

if stack_depth == 2
    dbup();
end

此快捷方式将:

  1. 将最近的用户功能打开到正确的行。
  2. 关闭抛出错误时打开的内置函数。
  3. 如果错误发生在离用户功能仅一个级别的位置,请切换到该工作区。
  4. 问题是dbup()只能运行一次 - 在调用之后,脚本中的执行会停止。没有功能可以切换到堆栈中的任意位置。