Matlab自定义dbstop处理程序

Phi*_*p F 5 debugging matlab dbstop

我知道人们已经讨论了如何制作自定义dbstop条件,(例如在MATLAB自定义dbstop)

但是,我正在使用正常dbstop if error,我想知道(来自另一个进程)matlab进程当前是处于调试状态(K>>)还是正常运行.

如果我有自定义dbstop处理函数,我可以这样做.但我仍然希望能够像平常一样进行动手调试dbstop if error.

如果还有其他可能从外部(>>vs K>>)检测matlab的状态,我也很高兴!

让我知道任何想法;)

Cat*_*azz 5

此命令允许您检查当前实例的调试状态:

feature('IsDebugMode')
Run Code Online (Sandbox Code Playgroud)

例如:

K>> feature('IsDebugMode')
ans =
     1
>> feature('IsDebugMode')
ans =
     0
>>
Run Code Online (Sandbox Code Playgroud)

我认为这不一定完全回答你的问题,因为你需要通过一个不同的过程来访问它,但我希望这是有帮助的.

注意:这是一个未记录的功能,因此可能会消失或更改版本之间的行为.


RTL*_*RTL 4

matlab 中的计时器可以生成一个单独的线程来等待,在该线程中可以解决需要从当前 matlab 实例外部查看的问题。我们可以设置计时器来检查调试模式是否处于活动状态以及是否要执行某些操作。

检查调试模式是否处于活动状态以及如果处于活动状态则执行某些操作的示例函数:

function mycallbackfunction(~,~)
        if feature('IsDebugMode') % undocumented thanks to CatzLoveJazz

        load handel
        sound(y,Fs)
Run Code Online (Sandbox Code Playgroud)

前两行是一个引人注目的示例,其他可能性是使用beep、 写入文件,或运行任何命令或函数。

        evalin('base','stop(timerHandle)') % stop the timer
    end
end
Run Code Online (Sandbox Code Playgroud)

可以修改此函数以评估“注意力吸引”一次,然后在调试模式不再处于活动状态时重置。目前,它依赖于停止然后手动重新启动计时器。

(注意:以前的版本有一个 else 但这是多余的,因为它在工作区繁忙时不会运行)

现在创建计时器对象。

timerTic=4; % how often the timer checks

timerHandle = timer();
timerHandle.startDelay = timerTic;
timerHandle.Period = timerTic;
timerHandle.ExecutionMode = 'fixedRate';
timerHandle.TasksToExecute = inf;
timerHandle.TimerFcn = @mycallbackfunction;
Run Code Online (Sandbox Code Playgroud)

并开始定时器调用

start(timerHandle)
Run Code Online (Sandbox Code Playgroud)

运行引人注目的线路后,计时器将自动停止。如果从未进入调试模式,计时器将继续运行,并且需要手动停止stop(timerHandle)

请记住在清除变量之前完成后运行delete(timerHandle)以删除对象timerHandle