在python中使用pdb以编程方式添加断点

问题描述 投票:0回答:1

我发现在大型多层软件中,通过在代码中添加以下代码来调试python代码通常更容易。

import pdb; pdb.set_trace()这在我放置语句的LOC处设置断点,我可以使用pdb以交互方式在代码中继续并检查代码执行等。

我想知道是否可以为这样的python调试添加多个断点,以便我可以在交互式python调试器中执行c并点击下一个断点?

即,例如

<python code>
import pdb; pdb.set_trace();
... interactive debugging....
...press c here....
<more python code>
...
....
<breakpoint>// How can we insert such a breakpoint? 
python pdb
1个回答
0
投票

我曾经通过大量修改ipdbhere做了这个。但是,我最近重新设计了这个轮子,我认为更简单的方法可以用于任何Bdb调试器。在pdbipdb上测试过

#!/usr/bin/env python3

import pdb
import sys
import ipdb.__main__

def foo(x):
  return x+1

class RunningTrace():
  def set_running_trace(self):
    frame = sys._getframe().f_back
    self.botframe = None
    self.setup(frame, None)
    while frame:
      frame.f_trace = self.trace_dispatch
      self.botframe = frame
      frame = frame.f_back
    self.set_continue()
    self.quitting = False
    sys.settrace(self.trace_dispatch)

class ProgrammaticPdb(pdb.Pdb, RunningTrace):
  pass

class ProgrammaticIpdb(ipdb.__main__.debugger_cls, RunningTrace):
  pass

p = ProgrammaticPdb()
# p = ProgrammaticIpdb(ipdb.__main__.def_colors)

p.onecmd('b bar.py:38') # Works before set_running_trace
p.set_running_trace()
p.onecmd('b foo')       # only works after calling set_running_trace
p.onecmd('l')

x=-1
x=2
x=0
x=foo(x)

print(x)

您可以在调用set_running_trace之前按文件/行号设置断点,但是在调用set_running_trace之后,您只能设置依赖于作用域的断点,例如本例中的函数名称foo

© www.soinside.com 2019 - 2024. All rights reserved.