pydevd从运行时代码触发CMD_ADD_EXCEPTION_BREAK

时间:2017-12-02 01:13:55

标签: python pycharm pydev remote-debugging

使用pydevd,有没有办法可以打开& off直接从运行时代码(而不是从调试服务器)暂停未捕获的异常代码,类似于添加pydevd.settrace()作为断点的行为?

基本上,我有一个大型应用程序,它使用生成器和线程来处理和操作大量数据。因此,手动设置断点可能非常麻烦。目前,我将检查堆栈跟踪,检查代码,并尝试构建一个条件pydevd.settrace(),希望仅在违规方案被触发时触发。这需要一些试验和错误。

我喜欢做的是制作(或使用)上下文管理器并包装违规代码

with pydevd.suspend_on_exception():
    ... code causing eventual exception ...

我在pydevd代码周围挖了一下,并尝试(没有运气)各种咒语试图模拟我认为远程调试器正在做的事情。我认为以下会让我接近,但没有骰子。

debugger = pydevd.get_global_debugger()
ex = debugger.add_break_on_exception('Exception', True, True, False, True)
debugger.update_after_exceptions_added([ex])
debugger.enable_tracing_in_frames_while_running_if_frame_eval()

(大致基于https://github.com/fabioz/PyDev.Debugger/blob/master/_pydevd_bundle/pydevd_process_net_command.py#L496

我正在使用pydevd连接到PyCharm远程调试服务器,以防这对解决方案产生影响。

1 个答案:

答案 0 :(得分:0)

这段代码对我来说似乎是正确的......

即:运行代码:

if __name__ == '__main__':
    import pydevd
    debugger = pydevd.get_global_debugger()
    ex = debugger.add_break_on_exception('Exception', True, True, False, True)
    debugger.update_after_exceptions_added([ex])
    debugger.enable_tracing_in_frames_while_running_if_frame_eval()

    def foo():
        raise Exception()

    foo()

在这里停止了正确的例外。

注意:这实际上是在最新的PyDev上测试的,而不是在PyCharm上,但行为应该是相同的。