我有一个[大]程序突然开始在无限循环中出现某处的问题。我找不到这个循环。
我做了:
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?
答案 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