有没有办法从ctrl + c这样的调试器中停止执行matlab程序,但是能够继续执行(比如你可以说c#)?
如果没有,除了尝试在matlab代码中预先设置断点或dbstop语句之外,还有更好的解决方法吗?
我希望能够中断长时间运行的模拟以查看当前状态,然后继续模拟.
我目前使用/考虑的两个选项是
代码中的dbstop命令(或(条件)断点).缺点是有时候我不想停止模拟几个小时,有时候想要在几秒钟之后停止(我不一定知道提前知道)并且这对这种方法不起作用:如果我将中断条件设置为每5分钟中断一次,我就不能让matlab在没有交互的情况下运行数小时.如果我将条件设置得更高,我必须等待太久才能达到条件.
包括每隔几秒/几分钟保存工作空间的代码,并将工作空间导入第二个matlab实例.缺点是这是一个巨大的麻烦,也不一定允许我使用已保存工作空间的状态恢复模拟,然后逐步执行代码几次迭代.
我希望有比2中任何一个更好的解决方案.感谢任何建议!
编辑:我认为我要做的是编写简单的matlab函数,每次迭代检查环境变量或磁盘上的文件,如果我在此文件或env中设置了一个标志,则调用dbstop.通过这种方式,我可以通过编辑文件来控制断点从matlab外部命中的时间(如果需要的话).凌乱,但应该工作.
Amr*_*mro 17
这不一定是最好的方法,但您可以模拟基于文件的信号/中断框架.可以通过在长模拟循环内每隔一段时间检查一次特定文件是否存在来完成.如果是,则使用该keyboard命令进入交互模式.
一些事情:
CHECK_EVERY = 10; %# like a polling rate
tic
i = 1; %# loop counter
while true %# long running loop
if rem(i,CHECK_EVERY) == 0 && exist('debug.txt','file')
fprintf('%f seconds since last time.\n', toc)
keyboard
tic
end
%# ... long calculations ...
i = i + 1;
end
Run Code Online (Sandbox Code Playgroud)
您可以像往常一样运行模拟.当您想要单步执行代码时,只需创建一个文件debug.txt(手动即可),执行将暂停并获得提示:
2.803095 seconds since last time.
K>>
Run Code Online (Sandbox Code Playgroud)
然后你可以像往常一样检查变量......要继续,只需运行return(不要忘记暂时重命名或删除文件).要退出,请使用dbquit
编辑:刚发生在我身上,而不是检查文件,更简单的解决方案是使用虚拟数字作为标志(只要数字是打开的,继续运行).
hFig = figure; drawnow
while true
if ~ishandle(hFig)
keyboard
hFig = figure; drawnow
end
%# ...
pause(0.5)
end
Run Code Online (Sandbox Code Playgroud)