Matlab调试:跳过下一行而不执行

时间:2016-06-30 17:43:22

标签: matlab debugging undocumented-behavior

问题: (问题的完整描述如下)

  • 有没有人建议如何欺骗Matlab跳过一行或几行代码? (mex / java /重写一些内部Matlab特性?)
  • 有谁知道db*代码文件的位置(如果存在)?

Matlab中有几个函数允许在调试/运行程序时进行流控制:dbstopdbcontdbstep等...我试图找到一个{ {1}}函数可以跳过Matlab脚本中的下一行,db*也许,但遗憾的是没有这样的内置功能,看起来这个feature似乎永远都不会实施(10年和计数)。

编辑使用示例:

以下脚本dbskip可以调用函数myScript,它根据输入的值决定是否跳过调用者脚本中的下一行,如下所示:

myFunc

修改

正如@Michael Smith建议的那样,实现这一目标的一种方法是编写一个程序,该程序将读取% myScript.m x = 1; myFunc(x); x = 2; x = 3; % myFunc.m function myFunc(u) if u == 1 % skip next line in caller -- how to? % ... do more stuff ... else % ... do other stuff ... disp('Business as usual.') end % ... do even more stuff ... end 并逐行执行它,跳过运行时指定的任何行。我相信这个解决方案是一个良好的开端;但是,在更复杂的情况下,函数调用中会有函数调用。因此,使用这种方法制作一个真正通用的解决方案,需要编写一个完整的Matlab代码解释器,它具有Matlab的所有功能以及我自己的一些要求。如果我可以使用Matlab的一些固有反射功能或者通过入侵调试系统,我想避免这种情况。

与此同时,我试图找到myScript.m的实施方式和位置。在调试任何dbstep函数时,结果是以下错误:

db*

我能找到的唯一Error using <db*> Debug commands only allowed when stopped in debug mode. 文件,包含没有任何代码的文档,因此我假设它是一个已编译的内置文件。

1 个答案:

答案 0 :(得分:1)

好吧,这可能会有点混乱。我可以想到两种可能的方法来做到这一点。其中之一涉及编辑脚本以使每行都有一个if语句,查看可以在工作区中修改的局部变量。我打算把它叫出来。让我们看看下一个想法。

matlab有一个命令eval(EXPRESSION),它接受一个字符串并执行。这是想法。让我们使用以下内容创建一个脚本/函数进行调试:

FID = fopen('<filename here>');
no_skip = true;
line_no = 1;

executing_script = 1;
while(executing_script == 1)
    line_no              %Print the line number
    line = fgetl(FID)    %removed the ; so it will write the line
    if(no_skip)
       eval(line)
    end
    line_no = line_no + 1;
end

在断点处有一个断点,允许你在断点处修改no_skip的值,使脚本不执行下一行。

如果有帮助,请告诉我。

进一步查看它似乎你必须确保你的while循环被关闭...所以如果你在脚本中使用if / while,这可能会有点复杂......抱歉。< / p>