什么原因会导致pdb.set_trace()被忽略?

13

我试图调试一个Python程序,在函数中插入了一个经典的'import pdb;pdb.set_trace()'语句,就在生成堆栈跟踪之前。然而,那个调用似乎被忽略了,也就是说,没有发生任何事情,我没有得到一个pdb提示。

在程序的那一点上,只有一个活动线程。没有检测到对pdb模块的任何猴子补丁。

欢迎提供任何关于导致set_trace调用被忽略的原因的帮助。谢谢。

平台信息:Debian Squeeze + Python 2.6.5

代码片段:

import threading
print threading.active_count()
import pdb
print pdb
pdb.set_trace()
print "*****"
root_resource.init_publisher() # before changing uid

输出:

<lots of stuff>
1
<module 'pdb' from '/usr/lib/python2.6/pdb.pyc'>
*****
<stack trace in init_publisher>

你能提供重现此问题的代码吗?从那里开始,print调用是否有效?你尝试过pdb.pm()吗?(http://docs.python.org/library/pdb.html#pdb.pm) - Katriel
很遗憾,我无法轻松地重现这个问题(否则我可能已经解决了)。print可以正常工作,但pdb.pm()失败了,因为此时我没有堆栈跟踪(并且后来某些C扩展程序吃掉了异常,所以我不能轻松地使用pm()和python -i)。 - gurney alex
3个回答

7
也许你有一些棘手的代码,以复杂的方式操作跟踪函数?或者你正在使用像psyco这样的加速器?

通过一些非常奇怪的设置,结果应用程序中的一个可选模块无法加载C扩展(缺少共享库),并默认使用了一个纯Python实现,该实现使用Psyco(http://psyco.sf.net)来加速处理。Psyco对Python框架进行了奇怪的操作,这使得Python调试器非常困惑。 - gurney alex

5
这将浪费许多Python开发者的时间。今晚我加入了他们的行列。我希望在花费2个小时发现我正在使用的一个大型库的类似问题之前,我能找到这篇文章。后续的谷歌搜索几乎没有对pdb和pysco不兼容的问题有所启示。该问题应该对刚开始使用pdb的用户更加明显。
在我导入的一个库的深处,有一个文件包含以下代码:
try:
    import psyco
    psyco.bind(bdecode)
    psyco.bind(bencode)
except ImportError:
    pass

作者真是个好心人,显然他假设没有人会使用他们的代码,而且还安装了psyco,也不会想要使用像pdb这样的调试工具;-) 话说回来,你可以问他们怎么会知道呢?

在探索问题时,我发现使用以下内容:

import pdb; pdb.set_trace() 

psyco导入后,程序就直接跳过了;没有任何节奏或理由。这确实令人沮丧。

这个问题不会影响使用PyDev或其他更高级的调试器进行调试,我猜这也是为什么它落在了初始谷歌搜索范围之外的原因。


1

你可能没有运行该语句,原因可能是:

  • 堆栈跟踪不在你认为的位置
  • 你在类似但错误的位置插入了set_trace调用
  • 你正在运行与你编辑的不同的.py文件
  • 你有自己的本地pdb.py文件被导入,而不是stdlib中的那个

不错的尝试,但是不行:我在原始消息中添加了一些代码,证明这不是情况。 - gurney alex
你是否从交互式控制台以外的地方输入stdin? - PaulMcG
1
另一个原因是:您有两种具有完全相同名称的方法(可能是因为您进行了复制/粘贴),而另一种没有 import pdb; pdb.set_trace() 的方法正在加载。 - Drew H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接