2010-08-12 178 views
9

我正在尝试调试一个Python程序,并且在函数中插入了一个经典的'import pdb; pdb.set_trace()'行,就在生成堆栈跟踪的调用之前。然而,这个调用似乎被忽略,即没有任何反应,我没有得到一个pdb提示符。什么会导致pdb.set_trace()被忽略?

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

欢迎任何有关可能导致set_trace调用被忽略的帮助。谢谢。

平台信息:Debian的挤压+蟒蛇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> 
+0

你能提供代码来重现吗?从那里打印电话工作?你尝试过'pdb.pm()'吗? (http://docs.python.org/library/pdb.html#pdb.pm) – katrielalex 2010-08-12 10:16:55

+0

不幸的是我无法轻松地重现(否则我现在可能已经钉住了它)。打印作品,pdb.pm()失败,因为我没有堆栈跟踪在这一点上(和例外后被一些C扩展名吃掉,所以我不能轻易使用pm()和python -i – 2010-08-12 10:22:58

回答

6

也许你已经有了操纵跟踪功能就比较复杂了一些棘手的代码?或者你使用像psyco这样的加速器?

+0

通过一些非常奇怪的设置,结果发现应用程序中的一个可选模块无法加载一个C扩展(缺少共享库),并默认使用psyco(http://psyco.sf.net)来加速事情的纯Python实现。Psyco用Python框架做了奇怪的事情,这使得python调试器非常困惑。 – 2010-08-12 13:44:30

0

你可能不运行的声明,或者是因为:

  • stackt比赛是不是你 以为是
  • 你插在 相似,但错误的地方set_trace呼叫
  • 您运行的是不同的.py文件 比你编辑
  • 你有你自己的本地PDB的一个.py文件 ,这是获得进口替代 一个从STDLIB
+0

好的尝试,但不:我在原始消息中添加了一些代码,表明情况并非如此 – 2010-08-12 10:53:16

+0

您是否从除交互式控制台以外的其他管道输入stdin? – PaulMcG 2010-08-12 13:30:19

4

这将浪费一些Python开发者的时间。今晚我加入了他们的队伍。我希望在发现与我正在使用的大型图书馆有类似问题之前,我已经发现了这篇文章。随后的谷歌搜索难以解决pdbpysco不兼容问题。从pdb开始,用户应该更容易看到问题。

图书馆,我进口了其中载有下列代码的文件的胆量内深:

try: 
    import psyco 
    psyco.bind(bdecode) 
    psyco.bind(bencode) 
except ImportError: 
    pass 

是作者,谁使用他们的代码,显然认为没有人的可爱姿态谁也安装了psyco,会喜欢使用诸如pdb这样的工具来调试它;-)请注意,你可以问他们怎么不知道呢?

虽然探索的问题,我发现其中的用法:

import pdb; pdb.set_trace() 

Psyco是进口,只是经过;既不是节奏也不是理性。的确非常令人沮丧。

该问题不影响用PyDev进行调试,或者我推测还有其他更高级的调试器,这是我猜为什么它不在最初的Google搜索范围之内。