【问题标题】:conditional breakpoint using pdb使用 pdb 的条件断点
【发布时间】:2019-03-14 18:13:19
【问题描述】:

听起来我错过了一些非常简单的东西,我正在尝试使用以下方法在我的 python 代码中设置断点:

if(some condition):
        pdb.set_trace()

我在代码中的错误是在大量迭代之后出现的。使用 print 等进行调试很困难。 当条件满足时我可以打印东西,但我想设置 brk-pt。

--编辑--

实际代码:

import pdb
if (node_num == 16):
    print node_num
    pdb.set_trace()

【问题讨论】:

  • 是的,你应该做什么,如果你有某种可以在该范围内访问的计数器,你可以简单地if count > limit: 然后执行将流入块,点击set_trace 和执行将在那里暂停。
  • 我刚刚尝试了一些非常简单的方法:if(condition): print "" pdb.set_trace() ########## print 出现但断点没有出现!!
  • 你导入pdb了吗?试试import pdb;pdb.set_trace()
  • 是的,我可以在 if 条件之外使用 pdb.set_trace()...是的,pdb 已导入
  • 你能用循环开始的完整代码更新你的问题吗,包括打印语句和pdb.set_trace()的调用?

标签: python pdb


【解决方案1】:

我看到你找到了解决方案 Sanjay。但是对于那些到这里来寻找一种方法来设置条件断点的人来说:

不要像if node_num == 16:这样的硬编码条件,而是以交互模式运行pdb。示例代码:

import pdb

for node_num in range(50):
  do_something(node_num)
...

在 shell 中使用 -m pdb 以调试模式启动脚本:

[rick@rolled ~]$ python -m pdb abc.py
> /home/dcadm/abc.py(1)<module>()
-> import pdb
(Pdb) l
  1  -> import pdb
  2
  3     for node_num in range(50) :
  4       foo = 2**node_num
[EOF]
(Pdb) b 4, node_num > 4
Breakpoint 1 at /home/dcadm/abc.py:4
(Pdb) c
> /home/dcadm/abc.py(4)<module>()
-> foo = 2**node_num
(Pdb) node_num 
5
(Pdb)

当 node_num 大于 4 时,pdb shell 命令 b 4, node_num &gt; 4 在第 4 行中断。

【讨论】:

    【解决方案2】:

    要在 pdb 中实际使用条件断点,您可以执行以下操作:

    b(reak) [([文件名:]lineno | 函数) [, 条件]]

    https://docs.python.org/3/library/pdb.html#pdbcommand-break

    例如,我正在运行一些迭代 django 视图的测试代码。我只想在达到我感兴趣的特定视图时打破

    b C:\Users\powlo\project\tests\TestCase.py:350, view.view_name == 'app.views.export'

    【讨论】:

      【解决方案3】:

      我不确定您的代码为什么不起作用,但您可以在本地机器上为您的最小示例创建一个新文件,看看您是否可以做您想做的事情

      import pdb
      
      for node_num in range(50):
          if node_num == 16:
              print(node_num)
              pdb.set_trace()
      

      现在运行它:

      16
      > /tmp/tmp.py(3)<module>()
      -> for node_num in range(50):
      (Pdb) p node_num
      16
      

      正如您所看到的,这在这个简单的示例中按预期工作,由您决定如何使其适应您的代码,和/或弄清楚您对代码/环境做了哪些其他操作来阻止该提示从出现。

      或者,如果您有一个函数在异常中死亡,并且您想知道导致它的确切行,您应该改用post_mortem。用这个包裹有问题的代码部分

      try:
          problem_function()
      except Exception:  # or the specific exception type thrown
          pdb.post_mortem()
          raise
      

      post_mortem 会在异常发生的点(特别是在该堆栈帧中)转储一个断点,这样就可以检查所有值,然后让您继续执行。但是,我还在末尾加了一个 raise 以允许异常继续正常进行,这是因为执行通常不会从它死亡的地方开始,而是由于post_mortem 调用而在该异常处理块处暂停。还不如在检查出问题后放弃。

      【讨论】:

      • @metatoaster..非常感谢您的回复,我尝试了很多不同的方法来调试这个问题,但最后看起来我超出了最大递归深度这可以通过添加来解决: sys.setrecursionlimit(10000) 这就是我无法设置断点的原因。我最初认为它与我的编译器有关,但是当我重新验证编译器等时,我发现这是问题它只是我从来没有想过我应该用谷歌搜索最大递归的东西
      • 抱歉耽搁了,因为怀疑是编译器错误,我把我的代码移到了另一个我有权限的服务器上
      • 我从上周才开始使用python(一般使用perl、c++、c等)...这肯定是我见过的最奇怪的错误...
      • @sanjay 哦,是的,如果你告诉我实际的例外情况,我会告诉你做其他事情。刚刚在此处编辑了答案以反映这一点。
      • 哦,是的,这看起来并不奇怪。 Python 默认没有尾递归,因此这个限制是为了防止堆栈溢出 - stackoverflow.com/questions/3323001/maximum-recursion-depth
      猜你喜欢
      • 1970-01-01
      • 2012-01-11
      • 2016-02-17
      • 2020-01-17
      • 2011-05-03
      • 1970-01-01
      • 2011-02-14
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多