【问题标题】:how to halt python program after pdb.set_trace()如何在 pdb.set_trace() 之后停止 python 程序
【发布时间】:2016-09-30 14:10:25
【问题描述】:

在 Python(2.7,在 Linux 上运行)中调试脚本时,我偶尔会注入 pdb.set_trace()(注意我实际上使用的是 ipdb),例如:

import ipdb as pdb
try:
    do_something()
    # I'd like to look at some local variables before running do_something_dangerous()
    pdb.set_trace()
except:
    pass
do_something_dangerous()

我通常从 shell 运行我的脚本,例如

python my_script.py

有时在调试过程中,我意识到我不想运行 do_something_dangerous()。停止程序执行以使 do_something_dangerous() 不运行并且我可以退出到 shell 的最简单方法是什么?

据我了解,按 ctrl-d(或发出调试器的退出命令)将简单地退出 ipdb,程序将继续运行(在我上面的示例中)。按 ctrl-c 似乎会引发一个 KeyboardInterrupt,但我从未理解它引发的上下文。

我希望像 ctrl-q 这样的东西可以简单地取消整个过程,但我找不到任何东西。

我知道我的示例非常做作,但我的问题是,当正在调试的代码设置为捕获异常时,如何从 pdb 中止执行。这不是关于如何重构上面的代码使其工作!

【问题讨论】:

    标签: python pdb ipdb


    【解决方案1】:

    我发现 ctrl-z 挂起 python/ipdb 进程,然后用 'kill %1' 终止进程效果很好,而且我输入起来相当快(使用 bash 别名 k='kill %1' )。我不确定是否有任何更清洁/更简单的东西。

    【讨论】:

    • 其实别名 k='kill %%; wait %% 2>/dev/null' 对我的目的来说要好一些(它会抑制 [1]+ 消息并在周围有其他工作时工作)
    【解决方案2】:

    来自module docs

    q(ui) 从调试器中退出。正在执行的程序被中止。

    具体来说,这将导致调用的下一个调试器函数引发BdbQuit 异常。

    【讨论】:

    • 我认为 ctrl-d 和 q(uit) 是相同的,并且我的代码设置为捕获异常,因此这不会成功终止我的程序。我将相应地更新我的示例,因为这根本不清楚!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2015-10-28
    • 1970-01-01
    • 2020-08-02
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多