2011-02-28 20 views
3

我寫的一個相當大的Python程序運行,但有時運行幾分鐘或幾小時後,在一個不容易重現的時刻,掛起並不輸出任何內容到屏幕上。調試:如何檢查我的Python程序掛在哪裏?

我不知道它當時在做什麼,它在代碼的哪一部分。

我該如何在調試器中運行或查看程序在掛起的那一刻執行哪些代碼行?

它太大而無法將「印刷」聲明放在整個地方。

我所做的:

python -m trace --trace /usr/local/bin/my_program.py 

但是這給了我這麼多的輸出,我實在看不出什麼,只是數百萬在屏幕上滾動的行。

如果我可以用「kill -SIGUSR1」或其他東西發送一些信號給程序,那麼程序就會進入一個調試程序並向我顯示它停止的行並且可能允許我執行然後通過程序。

我已經試過:

pdb usr/local/bin/my_program.py 

然後:

(Pdb) cont 

,但我該怎麼辦,看看我是當它掛起? 它不會拋出異常,只是看起來像是在等待某件事情,可能是在無限循環中。

一個更多的細節:當程序掛起時,我按^ C然後(不知道是否有必要)程序正常繼續(沒有拋出任何異常,沒有給我任何提示在屏幕上爲什麼它停止)。

+2

使用'logging'模塊讓程序知道正在做什麼並提供一些狀態信息。 – Apalala 2011-02-28 18:25:14

+0

嘗試將'import pdb; pdb.set_trace()'在你懷疑它掛起的地方。 – John 2011-02-28 18:54:48

+0

嗯,問這個問題的重點是我不知道它可能掛在哪裏,程序掛起大約需要10分鐘,所以我不能做太多的實驗,因爲它需要很長的時間。 – miernik 2011-02-28 19:07:34

回答

4

This could be useful to you.我通常做

>>> import pdb 
>>> import program2debug 
>>> pdb.run('program2debug.test()') 

我通常是一個-v選項添加到我的程序,這使得噸打印語句解釋我在細節正在做的。在將來編寫程序時,請考慮在做到數千行之前做同樣的事情。

+0

嗯,我的程序開始運行,只要我執行「import program2debug」這一行,所以我沒有機會鍵入「pdb.run ...」行。 – miernik 2011-02-28 18:34:25

+2

@miernik:我認爲您需要將程序的主體代碼放在一個名爲'test()'的函數中,以表示@Patrick建議的工作方式。 – martineau 2011-02-28 20:21:59

+2

@miernik:這就是爲什麼人們做'if __name__ =='__main__':main()'...這確保了當程序作爲模塊導入時,它不會立即執行。當然你也可以調用'test()'而不是main方法,這並不重要。 – Patrick 2011-03-01 14:03:48

1

您可以嘗試在IDE(如pydev(eclipse)或pycharm)中以調試模式運行它。您可以隨時打破該程序並進入當前執行點。

+0

謝謝,但是您提到的兩件事都涉及一些圖形程序,我無法在運行的計算機上安裝這些程序,並且錯誤(掛起)依賴於網絡,並且不會顯示在其他計算機上。 – miernik 2011-02-28 18:25:41

+0

錯過了最後一段:^ C的東西可能是你的程序等待鍵盤輸入的信號...... – 2011-03-01 18:33:36

1

沒有任何程序太大,無法將打印語句放在整個地方。您需要閱讀logging模塊並插入大量的logging.debug()語句。這只是輸出到文件的打印語句的一種更好的形式,並且可以在生產軟件中輕鬆關閉。但是從現在開始,當您需要修改代碼時,您可以輕鬆地將它重新打開,並從原始程序員的洞察中獲益。