可以从调试器停止并继续执行吗?

时间:2010-07-17 17:30:29

标签: debugging matlab

有没有办法停止从调试器执行matlab程序,如ctrl + c,但是能够继续执行(就像你可以说c#)?

如果没有,除了尝试在matlab代码中预先设置断点或dbstop语句之外,还有更好的解决方法吗?

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

我目前使用/考虑的两个选项是

  1. 代码中的dbstop命令(或(条件)断点)。 缺点是有时我不想停止模拟几个小时,有时想在几秒钟之后停止(我不一定提前知道)并且这对这种方法不起作用:如果我将中断条件设置为每5分钟中断一次,我就不能让matlab在没有交互的情况下运行数小时。如果我将条件设置为更高,我必须等待太长时间才能达到条件。

  2. 包括每隔几秒/几分钟保存工作区的代码,并将工作区导入第二个matlab实例。缺点是这是一个巨大的麻烦,也不一定允许我使用已保存工作空间的状态恢复模拟,然后逐步执行代码几次迭代。

  3. 我希望有比2中任何一个更好的解决方案。感谢任何建议!

    编辑:我认为我要做的是编写简单的matlab函数,每次迭代检查环境变量或磁盘上的文件,如果我在此文件中设置了一个标志,则调用dbstop或ENV。通过这种方式,我可以通过编辑文件来控制断点从matlab外部命中的时间(如果需要的话)。凌乱,但应该工作。

6 个答案:

答案 0 :(得分: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

您可以像往常一样运行模拟。当您想要介入代码时,只需创建一个文件debug.txt(手动即可),执行将停止并得到提示:

2.803095 seconds since last time.
K>> 

然后您可以照常检查变量...要继续,只需运行return(不要忘记暂时重命名或删除文件)。要退出,请使用dbquit


编辑:刚刚发生,而不是检查文件,更简单的解决方案是使用虚拟人物作为标志(只要图形打开,继续运行)。< / p>

hFig = figure; drawnow
while true
    if ~ishandle(hFig)
        keyboard
        hFig = figure; drawnow
    end

    %# ...
    pause(0.5)
end

答案 1 :(得分:10)

使用release of R2016a,您只需点击代码编辑器中的暂停按钮即可立即停止。键盘快捷键是Ctrl + F5。

  

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

当您的代码运行时,“开始”按钮将变为暂停:

enter image description here

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

答案 2 :(得分:4)

您可以在MATLAB编辑器中设置conditional breakpoint。您也可以使用DBSTOP执行此操作。例如,这将在第20行的文件myFcn中设置条件断点,当循环变量i是500的倍数时将停止执行:

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

然后,在检查了一些变量后,您可以continue execution

答案 3 :(得分:2)

如果将工作区保存到文件中是一个很好的代理,那么如何使用切换按钮创建一个简单的GUI。在您的代码中,检查按钮的状态。如果按下按钮,保存状态,更新静态文本以反映上次保存的时间戳,按下按钮。 (可选)根据切换按钮的状态设置条件断点。

答案 4 :(得分:1)

以下是使用waitinput File Exchange submission的替代解决方案。 优点是您可以在当前会话中使用它,或者在设置文件很麻烦的情况下使用它。此外,它不会在计算机上留下文件。

不幸的是,不幸的是,您需要等待检查时刻才能终止,而且需要花费一点时间。

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

如果需要,可以防止将线条打印到屏幕上。在这种情况下,您需要在图形窗口打开时输入输入(在窗口的开始栏中查找)。

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

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

答案 5 :(得分:0)

在某个版本之后(我完全不知道哪个版本):

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

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