Matlab自定义dbstop处理程序

时间:2014-03-24 09:24:26

标签: matlab debugging dbstop

我知道有人讨论了如何制定自定义dbstop条件, (例如在Customize dbstop in MATLAB

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

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

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

让我知道任何想法;)

4 个答案:

答案 0 :(得分:5)

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

feature('IsDebugMode')

例如:

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

我认为这不一定能完全解决你的问题完全,因为你需要通过不同的流程来访问它,但我希望这一切都是有帮助的。

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

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

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

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

现在创建计时器对象。

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以删除对象

答案 2 :(得分:3)

我不知道如何实现你所要求的。

但是,也许你可以:

  1. 抓住异常(在try-catch区块中)。
  2. catch块内,启动您想要的任何外部进程,或向其发送消息,指示MATLAB存在问题(可能包括消息中捕获的异常的一些详细信息)。
  3. 立即rethrow(或throwthrowAsCaller)发现任何异常。
  4. 仅在重新抛出错误时使用dbstop if error进入调试模式。
  5. 通过这种方式,您应该能够获得一个外部进程来通知您错误,并仍然进入调试模式进行检查。

答案 3 :(得分: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有哪个值。