【问题标题】:pydevd trigger CMD_ADD_EXCEPTION_BREAK from runtime codepydevd 从运行时代码触发 CMD_ADD_EXCEPTION_BREAK
【发布时间】:2018-05-16 03:51:47
【问题描述】:

使用 pydevd,有没有一种方法可以直接从运行时代码(而不是从调试服务器)打开和关闭挂起未捕获异常的代码,类似于添加 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 远程调试服务器,以防对解决方案产生影响。

【问题讨论】:

    标签: python pycharm pydev remote-debugging


    【解决方案1】:

    那个代码对我来说似乎是正确的......

    即:运行代码:

    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 上,但行为应该是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      相关资源
      最近更新 更多