停止并继续从debugging器执行可能?

有没有什么办法可以像ctrl + c那样从debugging器中停止执行matlab程序,但是能够继续执行(就像你可以说c#)?

如果没有,是否有更好的方法来解决这个问题,而不是试图在你的matlab代码中抢先设置断点或dbstop语句?

我希望能够中断一个长时间运行的模拟来查看当前状态,然后继续模拟。

我正在使用/正在考虑的两个选项是

  1. dbstop命令(或(条件)断点)在代码中。 缺点是有时我不想停止模拟几个小时,有时候只想几秒钟就停下来(而且事先不一定知道这一点),而且这种方法不适用:如果我每5分钟设置一次中断条件,我就不能让matlab在没有交互的情况下运行数小时。 如果我把条件设定得更高,我必须等待时间太久才能达到目标。

  2. 包括每隔几秒钟/分钟保存工作空间的代码,并将工作空间导入第二个matlab实例。 缺点是这是一个巨大的麻烦,也不一定让我恢复与保存工作空间的状态,然后通过代码一些迭代的仿真。

我希望有一个比任何一个更好的解决scheme2.感谢您的任何build议!

编辑 :我想我要做的是写简单的matlab函数,每次迭代检查磁盘上的环境variables或文件,并调用dbstop,如果我在此文件或env设置标志。 这样我就可以通过编辑文件来控制何时(如果需要的话)断点从外部matlab控制。 凌乱,但应该工作。

这不一定是最好的方法,但是你可以模拟一个基于文件的信号/中断框架。 这可以通过在长时间的模拟循环中每隔一段时间检查特定文件的存在来完成。 如果是,则使用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 

你会照常运行你的模拟。 当你想进入代码时,只需创build一个文件debug.txt (手动),执行就会停止,你会得到如下提示:

 2.803095 seconds since last time. K>> 

你可以像往常一样检查你的variables…继续,只需运行return (不要忘记暂时重命名或删除文件)。 为了退出,使用dbquit


编辑:刚刚发生在我身上,而不是检查文件,更简单的解决scheme将是使用一个虚拟数字作为标志(只要数字打开,继续运行)。

 hFig = figure; drawnow while true if ~ishandle(hFig) keyboard hFig = figure; drawnow end %# ... pause(0.5) end 

随着R2016a的发布 ,您可以在代码编辑器中点击暂停button,它将立即停止。

要在运行时暂停程序的执行,请在“编辑器”选项卡中单击“暂停”button。 MATLAB在下一个可执行行*处暂停执行。

当您的代码正在运行时,“开始”button将变为暂停:

在这里输入图像描述

此版本的另一个变化是在运行时添加/删除断点的function。 以前,你显然不能这样做。

您可以在MATLAB编辑器中设置条件断点 。 你也可以使用DBSTOP来做到这一点。 例如,这将在第20行的文件myFcn中设置一个条件断点,当循环variablesi是500的倍数时将停止执行:

 dbstop in myFcn.m at 20 if rem(i,500) == 0 

然后,在检查一些variables后,可以继续执行 。

如果把工作区保存到一个文件是一个你想要的代理的好代理,那么用一个切换button来做一个简单的GUI怎么样。 在你的代码中,检查button的状态。 如果按下button,则保存状态,更新静态文本以反映上次保存的时间戳,然后按下button。 可选地,根据该切换button的状态具有条件断点。

这是使用waitinput File Exchange提交的备用解决scheme。 好处是您可以在当前会话中使用它,或者在设置文件很麻烦的情况下使用它。 也不会在计算机上留下文件。

缺点是不幸的是,你需要等待检查的时刻,然后才能终止,花费一点时间。

 for t = 1:10 pause(3) %Doing some calculations str = waitinput('Enter 1 if you want to stop ',5); if ~isnan(str) keyboard; % Enter dbcont if you want to continue from here end ['moving on, it is now: ' datestr(now)] pause(3) %Doing some more calculations end 

如果你愿意,你可以防止行被打印到屏幕上。 在这种情况下,您需要在数字窗口打开时inputinput(在窗口中查看您的开始栏)。

总而言之,您可以放置​​在某个条件断点处的短代码是:

 if ~isnan(waitinput('',5)) keyboard; end 

经过一定的版本(我不知道是哪一个):

Windows:Ctrl + F5
Mac:Command + F5(我猜)
Unix:我也在寻找答案

2016a之后,界面上也有一个button。