Debugging 是否可能从调试器停止并继续执行?

Debugging 是否可能从调试器停止并继续执行?,debugging,matlab,Debugging,Matlab,有没有办法像ctrl+c那样从调试器停止matlab程序的执行,然后继续执行(比如说c#) 如果没有,除了在matlab代码中先发制人地设置断点或dbstop语句之外,还有其他更好的方法来解决这个问题吗 我希望能够中断长时间运行的模拟,查看当前状态,然后继续模拟 我目前正在使用/考虑的两个选项是 代码中的dbstop命令(或(条件)断点)。 缺点是,有时我不想停止模拟几个小时,有时只想在几秒钟后停止(我不一定事先知道),这种方法不适用:如果我将中断条件设置为每5分钟中断一次,我不能让matlab

有没有办法像ctrl+c那样从调试器停止matlab程序的执行,然后继续执行(比如说c#)

如果没有,除了在matlab代码中先发制人地设置断点或dbstop语句之外,还有其他更好的方法来解决这个问题吗

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

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

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

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

  • 我希望有一个比这两个更好的解决方案。谢谢你的建议

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

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

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

    然后,您可以在检查一些变量之后进行操作。

    这不一定是最好的方法,但您可以模拟基于文件的信号/中断框架。这可以通过每隔一段时间在长模拟循环中检查一次特定文件的存在来实现。如果是,则使用
    键盘
    命令进入交互模式

    大致如下:

    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


    编辑:我刚想到,与其检查文件,更简单的解决方案是使用虚拟图形作为标志(只要图形打开,保持运行)


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

    下面是使用的替代解决方案。 优点是,您可以在当前会话中或在设置文件很麻烦的情况下从white使用它。而且它不会在计算机上留下文件

    不幸的是,在终止之前,您需要等待检查时刻,这需要花费一点时间

    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
    
    如果需要,可以防止在屏幕上打印行。在这种情况下,您需要在“体形”窗口打开时输入输入(查看windows上的开始栏)

    总之,您可以将以下简短代码放在条件断点之类的地方:

    if ~isnan(waitinput('',5))
        keyboard; 
    end
    
    使用,您只需点击代码编辑器中的暂停按钮,它就会立即停止。键盘快捷键为Ctrl+F5

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

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

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

    在特定版本之后(我不知道确切的版本):

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


    2016a之后,界面上也会有一个相应的按钮。

    也许您可以尝试条件断点Hanks Amro,但条件断点/dbstops是我在选项1中所做的,我可能应该编辑问题以使其更清楚。对我来说,这根本不是一个理想的解决方案。不幸的是,这就是为什么我希望有一个更好的选择。哦,我刚刚读了你的编辑,正是我所想的。谢谢,这就是我在问题中选择1的意思。但正如我所说,这有一个缺点,我不知道多少分钟后,我想停止先验。i、 e.如果条件中的500对应于5分钟的执行,我不能简单地让模拟运行几个小时,而是必须每5分钟与matlab交互,否则sim停止。相反,如果我将500改为5000(50分钟运行时间),我必须等待50分钟,直到matlab第一次停止…我实际上只是在考虑可能按照这些思路做一些事情:)可能会尽可能好。谢谢@BenSchwehn:idea=使用虚拟图形而不是外部文件我喜欢图形的想法!在命令行上运行时不起作用,
    if ~isnan(waitinput('',5))
        keyboard; 
    end