【问题标题】:In pdb (python debugger), can I set a breakpoint on a builtin function?在 pdb(python 调试器)中,我可以在内置函数上设置断点吗?
【发布时间】:2012-08-18 05:31:04
【问题描述】:

我想在 set.update() 函数上设置一个断点,但是当我尝试时,我收到一条错误消息。

例子:

ss= set()
ss.update('a')

断点:

b set.update
b ss.update

错误:

The specified object 'ss.update' is not a function
or was not found along sys.path.

The specified object 'set.update' is not a function
or was not found along sys.path.

(请注意,我也尝试使用末尾的括号,例如b set.update(),但仍然出现错误。我没有打印所有错误排列。)

【问题讨论】:

  • 如果您有模块的py 文件,那么您可以,如果只有pyc 文件,您将无法这样做...
  • 嗨@avasal,我有py 文件,我该怎么处理它?
  • 有两种方法,首先你可以在调用内置函数之前在代码中设置一个断点然后单步执行,第二种是你可以修改内置模块文件,通过在文件并添加pdb.set_trace()然后开始调试
  • 第一种方法太费力了——有无数次调用update 来获取分散在我的代码中的各种集合。第二种方法对我不起作用。我尝试了两种方法: 1. 我在 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7 中编辑了 sets.py 文件结果:程序在 pdb.set_trace() 处没有停止运行 2. 我尝试通过 file:line number 设置断点,b sets.py:343 但得到了这个错误:Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x10dcb6140> ignored
  • 我想通了,会更新我原来的问题。

标签: python pdb


【解决方案1】:

谢谢!使用@avasal 的回答和Doug Hellmann's pdb webpage,我想出了这个:

因为我试图捕获 set.update,所以我不得不编辑 sets.py 文件,但这还不够,因为 python 使用的是内置的 set 类而不是我编辑的那个。所以我覆盖了内置的集合类:

import sets
locals()['__builtins__'].set=sets.Set

然后我可以在调试器中设置条件断点:

b set.update, iterable=='a' #successful
b set.update, iterable=='b' #won't stop for ss.update('a')

我的整个示例文件如下所示:

import pdb
import sets
locals()['__builtins__'].set=sets.Set

pdb.set_trace()
ss = set()
ss.update('a')

print "goodbye cruel world"

然后在调试器提示符下输入:

b set.update, iterable=='a'

希望这对其他人也有帮助。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多