Matlab调试:跳过下一行而不执行
问题: (问题的完整描述如下)Matlab调试:跳过下一行而不执行,matlab,debugging,undocumented-behavior,Matlab,Debugging,Undocumented Behavior,问题: (问题的完整描述如下) 有人对如何欺骗Matlab跳过一行或几行代码有什么建议吗?(mex/java/重写一些Matlab内部功能?) 是否有人知道db*代码文件可能位于何处(如果存在) Matlab中有几个函数允许在调试/运行程序时进行流量控制:dbstop、dbcont、dbstep,等等。。。我试图找到一个db*函数,它可能会跳过Matlab脚本中的下一行,dbskip,但遗憾的是,它没有这样的内置功能,而且似乎永远也不会实现(10年后开始计算) 编辑使用示例: 以下脚本,my
- 有人对如何欺骗Matlab跳过一行或几行代码有什么建议吗?(mex/java/重写一些Matlab内部功能?)
- 是否有人知道
代码文件可能位于何处(如果存在)李>db*
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
文件包含没有任何代码的文档,因此我假设它是一个编译的内置文件 好吧,这可能会有点混乱。我可以想出两种可能的方法。其中之一是编辑脚本,使每一行都有一个if语句,用于查看可以在工作区中修改的局部变量。我要把这件事说出来。让我们来看下一个想法
matlab有一个命令eval(表达式),它接受字符串并执行。这是我的想法。让我们创建用于调试的脚本/函数,如下所示:
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
FID=fopen(“”);
否=真;
线路号=1;
执行_脚本=1;
while(执行_脚本==1)
行号%打印行号
行=fgetl(FID)%;所以它会写这行
如果(不跳过)
评估(行)
结束
线路号=线路号+1;
结束
在那里有一个断点将允许您在断点上修改no_skip的值,使脚本不会执行下一行
让我知道这是否有帮助
进一步查看后,您似乎必须确保while循环已关闭。。。因此,如果在脚本中使用if/while,这可能会稍微复杂一些。。。抱歉。您可以注释掉要跳过的特定行@Sardar_Usama,没错;但是,在程序运行时不能注释掉行
db*
函数在程序运行时工作。我认为内置函数目前不可能工作,即使是最新版本(2016a)。@AlexanderF。如何在其他语言/环境中实现类似的功能。。。?我想你可以使用global
变量。。。把它想象成某种“通用调试标志”。。或者将相关代码包装在对shouldExecuteThis()
函数的调用中,该函数具有持久的executionMode
设置(可能是二进制标志的组合),如果需要,可以在运行时更改该设置。。。如果这对您有意义,我可以写一个答案来说明这种方法。@Dev iL。我想在其他语言中,我会使用一些变化的goto
。您是否可以找到一种方法来生成一个具有复杂调用层次结构的完全通用的解决方案,在该解决方案中,可以在任何地方做出跳过一行(或更多行)的决定,并且不会因为太多的shouldExecuteThis()
?您也可以让它在其中打印行,这样您就知道自己在哪里了。或者甚至可以拨打电话号码。谢谢你尝试一下。我认为处理角落案例不应该是一个问题,因为对于、而
等有有限数量的。。。我自己也想过做一些类似的事情,但是我想用一种更有机的方式来运行一个程序,而不需要专门的脚本来解释它。这就是为什么我要对调试系统进行黑客攻击。在我的问题中给出的示例中可能不太清楚,但是一旦myFunc
跳过调用方工作区中的一行,它就不一定返回,它可能有更多的语句要根据它跳过/读取的行执行。