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'
每个线程必须执行一次,因为它只影响当前线程。
我有一个 [大] 程序突然开始出现问题 某处 无限循环。我找不到这个循环。
我做到了:
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'
每个线程必须执行一次,因为它只影响当前线程。