我正在尝试调试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
Run Code Online (Sandbox Code Playgroud)
输出:
<lots of stuff>
1
<module 'pdb' from '/usr/lib/python2.6/pdb.pyc'>
*****
<stack trace in init_publisher>
Run Code Online (Sandbox Code Playgroud)
这将浪费大量 Python 开发人员的时间。今晚我将自己加入了他们的行列。我希望在我花了 2 个小时发现我正在使用的大型图书馆的类似问题之前找到了这篇文章。随后的谷歌搜索几乎没有说明pdb和pysco不兼容的问题。对于刚开始使用 pdb 的用户来说,这个问题应该更明显。
在我导入的库的内部深处是一个包含以下代码的文件:
try:
import psyco
psyco.bind(bdecode)
psyco.bind(bencode)
except ImportError:
pass
Run Code Online (Sandbox Code Playgroud)
多么可爱的作者姿态,他显然假设没有人使用他们的代码,并且还安装了 psyco,愿意使用pdb 之类的工具来调试它;-) 请注意,你可以问他们是什么意思反正不知道?
在探索这个问题时,我发现了以下用法:
import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
之后的进口Psyco的,只是经过; 既不是节奏也不是原因。确实非常令人沮丧。
该问题不会影响使用PyDev或其他更高级的调试器进行调试,我猜这就是为什么它不在最初的 Google 搜索范围之内。