2010-08-12 90 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搜索範圍之內。

相關問題