5

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

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

如果我有一个自定义dbstop处理函数,我可以做到这一点。但我仍然希望能够像正常的dbstop if error.

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

让我知道任何想法;)

4

4 回答 4

5

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

feature('IsDebugMode')

例如:

K>> feature('IsDebugMode')
ans =
     1
>> feature('IsDebugMode')
ans =
     0
>>

我认为这不一定能完全回答您的问题,因为您需要通过不同的流程来访问它,但我希望这同样有帮助。

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

于 2014-03-28T10:07:37.913 回答
4

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

检查调试模式是否处于活动状态以及是否处于活动状态的示例函数:

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

        load handel
        sound(y,Fs)

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

        evalin('base','stop(timerHandle)') % stop the timer
    end
end

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

(注意:以前的版本有一个 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;

并开始计时通话

start(timerHandle)

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

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

于 2014-03-28T17:25:58.687 回答
3

我不知道有一种方法可以完全实现您的要求。

但是,也许您可​​以:

  1. 捕获异常(在一个try-catch块中)。
  2. 在该catch块中,启动您想要的任何外部进程,或向其发送消息,指示 MATLAB 存在问题(可能包括消息中捕获的异常的一些详细信息)。
  3. 立即rethrow(或throw,或throwAsCaller)捕获到任何异常。
  4. 用于dbstop if error仅在重新抛出错误时进入调试模式。

通过这种方式,您应该能够获得一个外部进程来通知您错误,并且仍然可以进入调试模式来检查它。

于 2014-03-27T16:11:36.353 回答
0

我的猜测是,您正在寻找一种方法让 matlab 在发生错误时执行某些操作,并且仍然可以捕获它。尝试以下功能中的设置:

function testscript(s)
try
x=2;
x=y;
catch err
    beep %Or send a signal to an other program
    rethrow(err) %This will trigger dbstop if error
end
end

请注意,当您捕获错误时,您仍然可以看到哪个值x有。

于 2014-03-28T15:13:41.200 回答