Python PDB 不会停止

Python PDB won't stop

我有一个 [大] 程序突然开始出现问题 某处 无限循环。我找不到这个循环。

我做到了:

import pdb
pdb.run ( 'main()' )

所以当程序进入无限循环时,我按下 control-C 并且……它没有做任何事情。其实我不用pdb的时候,control-C也没用

我没有覆盖信号。即使我这样做了,control-C 也什么都不做。

我 运行 在 lldb 中查看问题是否出在 C++ 领域的某个地方,它不是 - 它肯定被冻结执行 python 废话(在线程 #7 上,如果这很重要)。

如何让 pdb 在 control-c 上真正中断?

查看 PDB docs

您应该使用 pdb.set_trace() 在您的函数中添加一个断点(在您的示例中为 main) 然后您可以使用命令行 运行 函数(例如 python myprog.py),程序将在您设置断点的位置停止。

import pdb

def main():
    i = 0

    while i<10:
        print i
        if i == 8:
            pdb.set_trace()
        i += 1

在上面的示例中,程序将在 i==8

时停止调试

这是一个简单的 'debugger',它计算每一行被传递的次数,并在一行被命中太多次时引发错误。如果真的有循环,希望它能帮助找到循环。

from bdb import Bdb
from collections import Counter

class LoopDetector(Bdb):
    def __init__(self, maxhits):
        Bdb.__init__(self)
        self.counter = Counter()
        self.maxhits = maxhits

    def do_clear(self, arg):
        pass

    def user_line(self, frame):
        filename = frame.f_code.co_filename
        lineno = frame.f_lineno
        key = (filename, lineno)
        self.counter[key] += 1
        if self.counter[key] >= self.maxhits:
            raise ValueError('Too many hits at %s:%s' % key)

LoopDetector(1000).set_trace()

x = 1
y = x + 2
for i in range(200):
    y += i

while True:  # An exception gets raised here
    y -= 1

print 'Does not get here'

每个线程必须执行一次,因为它只影响当前线程。