问题 什么可以导致pdb.set_trace()被忽略?


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

10659
2017-08-12 10:04


起源

你能提供代码来重现这个吗?做 print 来电从那里工作?你有没有尝试过 pdb.pm()? (docs.python.org/library/pdb.html#pdb.pm) - Katriel
不幸的是,我无法轻易地重现这一点(否则我现在可能会将其钉死)。打印工程,pdb.pm()失败,因为我在那个时候没有堆栈跟踪(稍后某些C扩展会吃掉异常,所以我不能轻易使用pm()和python -i - gurney alex


答案:


也许你有一些棘手的代码以复杂的方式操纵跟踪功能?或者你使用像psyco这样的加速器?


7
2017-08-12 11:47



通过一些非常奇怪的设置,结果是应用程序中的一个可选模块无法加载C扩展(缺少共享库)并且在使用psyco的纯python实现上默认(psyco.sf.net)加快事情。 Psyco使用python框架做了奇怪的事情,这使得python调试器非常困惑。 - gurney alex


这将浪费许多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的 或者,我认为,其他更高级的调试器,我猜它为何不属于最初谷歌搜索的雷达。


4
2017-10-08 20:00





您可能没有运行该语句,因为:

  • stacktrace不是你的地方 认为这是
  • 你插入了一个set_trace调用 相似但错误的地方
  • 您正在运行另一个.py文件 比你编辑的那个
  • 你有自己的本地pdb.py文件 那是进口而不是 来自stdlib的那个

0
2017-08-12 10:17



不错的尝试,但没有:我在原始邮件中添加了一些代码,表明情况并非如此。 - gurney alex
你是否从交互式控制台以外的东西管道stdin? - PaulMcG