2

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

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

Matlab 中有几个函数允许在调试/运行程序时进行流控制:dbstop, dbcont,dbstep等...我试图找到一个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逐行读取并执行它,跳过在运行时指定的任何行。我相信这个解决方案是一个好的开始;但是,在更复杂的情况下,函数调用中会有函数调用。因此,使用这种方法制作一个真正通用的解决方案需要编写一个成熟的 Matlab 代码解释器,它具有 Matlab 的所有功能以及我自己的一些要求。如果我可以使用 Matlab 的某些固有反射功能或侵入调试系统,我想避免这种情况。

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

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

我能找到的唯一dbstep.m文件包含没有任何代码的文档,所以我假设它是编译的内置文件。

4

1 回答 1

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,这可能会更复杂......对不起。

于 2016-07-01T03:41:03.893 回答