我经常发现自己处于这种情况,我在代码中插入了很多keyboard
命令来调试它。但是,我希望有更多的灵活性。这就是我开始编写stahp
函数的原因。
function stahp()
disp('Stahp requested.');
dbstack
disp('You can either');
disp(' 1 abort.');
disp(' 2 continue.');
disp(' 3 debug.');
in = input('Choose what to do:\n');
switch(in)
case 1
error('Stahp.');
case 2
disp('Continue.')
case 3
disp('Debug.');
keyboard % <------------------------------------ Here is my problem
otherwise
stahp();
end
end
这个想法是,让用户选择,他想做什么(继续,中止,调试,将来可能还有别的东西)。但是,我宁愿不在stahp
函数内启动调试模式,而是在退出之后。
例如,运行时
function test_stahp
a = 1
stahp()
b = 2
end
我想在b=2
之前进入调试模式。我假设,dbstep out
可以以某种方式使用,但到目前为止我尝试的方式,你仍然需要手动退出stahp()
。我也知道,stahp()
中otherwise
的递归调用可能会使事情变得复杂,但我可以删除该部分。
非常感谢任何帮助。谢谢。
答案 0 :(得分:1)
您可以使用dbstack
获取当前堆栈,然后检索调用函数的名称和调用stahp
的行号。使用此信息,您可以使用dbstop
在执行函数调用的函数中创建断点。下面的代码示例在b = 2行的test_stahp
中设置断点。
function stahp()
disp('Stahp requested.');
dbstack
disp('You can either');
disp(' 1 abort.');
disp(' 2 continue.');
disp(' 3 debug.');
in = input('Choose what to do:\n');
r=dbstack;
switch(in)
case 1
dbclear(r(2).name,num2str(r(2).line+1));
error('Stahp.');
case 2
dbclear(r(2).name,num2str(r(2).line+1));
disp('Continue.')
case 3
disp('Debug.');
dbstop(r(2).name,num2str(r(2).line+1))
otherwise
stahp();
end
end