Python PDB不会停止

时间:2016-05-10 18:11:58

标签: python multithreading infinite-loop lldb pdb

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

我做了:

yum install tunctl
ifup tap_vpnlocal

所以当程序进入无限循环时,我点击了控制-C并......它没有做任何事情。事实上,当我不使用pdb时,control-C也不起作用。

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

我在DEVICE=tap_vpnlocal TYPE=Tap ONBOOT=yes STP=no IPADDR=192.168.30.1 NETMASK=255.255.255.0 BROADCAST=192.168.30.255 NM_CONTROLLED="yes" BOOTPROTO=static 中运行它以查看问题是否存在于C ++的某个地方 - 并且它不是 - 它肯定会冻结执行python废话(如果重要的话,在#7号线上) )。

如何让import pdb pdb.run ( 'main()' ) 真正打破control-c?

2 个答案:

答案 0 :(得分:1)

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

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'

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

答案 1 :(得分:0)

查看PDB docs

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

import pdb

def main():
    i = 0

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

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

时停止调试