MATLAB调试:无执行的下一行



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

  • 是否有人对如何欺骗Matlab跳过一行或几行代码有建议?(Mex/Java/重写一些内部MATLAB功能?)
  • 有人知道db*代码文件的位置(如果存在)吗?

MATLAB中有几个功能可以在调试/运行程序时允许流控制:dbstopdbcontdbstep等...我正在尝试找到一个db*函数,该函数会跳过MATLAB脚本中的下一行,也许dbskip,但可悲的是,没有这样的内置功能,而且似乎不会实现此功能(10年并计数)。

编辑使用的示例:

以下脚本myScript可以调用一个函数myFunc,该函数根据其输入的值来决定是否跳过呼叫者脚本中的下一行,例如:

% 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

编辑

正如@michael Smith所建议的那样,实现这一目标的一种方法是编写一个程序,该程序将读取myScript.m并通过行跳过行以运行时指定的任何行执行行执行IT行。我相信这个解决方案是一个良好的开始。但是,在更复杂的情况下,功能调用中会有函数调用。因此,使用这种方法制作真正的通用解决方案,需要编写一个完整的MATLAB代码解释器,具有MATLAB具有的所有功能以及我自己的某些要求。如果我可以使用MATLAB固有的反射功能或黑客入侵调试系统,这是我想避免的。

与此同时,我撞到了另一堵墙,试图找到dbstep的实现方式。调试任何db*功能时,结果是以下错误:

Error using <db*> 
Debug commands only allowed when stopped in debug mode.

我能找到的唯一dbstep.m文件包含文档,而没有任何代码,因此我认为它是内置的。

好吧,这可能会有些混乱。我可以想到两种可能的方法来做到这一点。其中之一涉及编辑脚本以使每行具有IF语句查看可以在工作区中修改的本地变量。我要把这个叫出来。因此,让我们看看下一个想法。

matlab具有一个命令est(表达式),该命令(表达式)吸用字符串并执行。这是想法。让我们创建一个脚本/函数,用于调试以下内容:

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的值,使脚本不执行下一行。

让我知道这是否有帮助。

进一步查找后,似乎必须确保您的循环关闭...因此,如果您在脚本中使用/时使用,这可能会更加复杂...对不起。<<。/p>

最新更新