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

13 投票
3 回答
13224 浏览
提问于 2025-04-16 02:41

我正在调试一个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>

3 个回答

1

你可能没有运行那个语句,原因可能有以下几种:

  • 错误信息的追踪位置并不是你想的那个地方
  • 你把设置跟踪的代码放在了一个相似但错误的位置
  • 你运行的是一个和你编辑的不同的.py文件
  • 你有一个自己的本地pdb.py文件,它被导入了,而不是标准库里的那个
5

这篇文章可能会浪费一些Python开发者的时间。今晚我也加入了这个行列。我真希望在花了两个小时发现我正在使用的一个大库的类似问题之前能看到这篇帖子。之后在谷歌上搜索这个问题,关于pdbpysco不兼容的情况几乎没有找到什么有用的信息。这个问题应该更明显一些,特别是对于刚开始使用pdb的用户。

在我导入的一个库的深处,有一个文件包含了以下代码:

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

作者真是个好心人,显然他认为没有人会同时使用他们的代码和安装了psyco的人会想用pdb这样的工具来调试它 ;-) 不过,你也可以问,他们又怎么会知道呢?

在探索这个问题时,我发现使用:

import pdb; pdb.set_trace() 

导入psyco之后,这部分代码就被忽略了,完全没有理由。这实在让人感到沮丧。

这个问题并不影响使用PyDev进行调试,或者我想其他更高级的调试工具也是如此,这大概就是为什么它在初步的谷歌搜索中没有被注意到的原因。

7

也许你有一些复杂的代码,它以很复杂的方式处理跟踪功能?或者你在使用像psyco这样的加速器?

撰写回答