我知道有人讨论了如何制定自定义dbstop
条件,
(例如在Customize dbstop in MATLAB)
但是,我正在使用普通的dbstop if error
,我想知道(来自另一个进程)matlab进程当前是处于调试状态(K>>
)还是正常运行。
如果我有自定义dbstop
处理函数,我可以这样做。但我仍然希望能够像普通dbstop if error
那样进行动手调试。
如果还有其他可能从外部检测matlab的状态(>>
vs K>>
),我也很高兴!
让我知道任何想法;)
答案 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)
我不知道如何实现你所要求的。
但是,也许你可以:
try-catch
区块中)。catch
块内,启动您想要的任何外部进程,或向其发送消息,指示MATLAB存在问题(可能包括消息中捕获的异常的一些详细信息)。rethrow
(或throw
或throwAsCaller
)发现任何异常。dbstop if error
进入调试模式。通过这种方式,您应该能够获得一个外部进程来通知您错误,并仍然进入调试模式进行检查。
答案 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
有哪个值。