2010-11-26 77 views
6

我正在尋找一種方法來「回顧」調試python異常。本質上,如果我的程序引發了一個未處理的異常,我希望它能夠保存程序狀態,以便稍後返回並調試問題。我如何追溯調試python異常

我已經看了一下pdb文檔,看來你可以做到這一點,但前提是你可以在異常時與程序進行交互。這對我來說不起作用,因爲程序將在後臺運行(沒有控制終端)。

我的第一個(註定失敗!)方法是在我的程序的最高級別放置try/except塊,並在except塊中從當前異常中提取traceback對象並使用pickle將其寫入磁盤。然後,我計劃編寫一個單獨的程序,以取消對象的使用並使用pdb.post_mortem來調試崩潰的程序。但是回溯對象不是可以選擇的,但我不希望它能夠繼續工作,因爲它不會保存整個程序狀態。

+2

這並不能解決您的問題,而是將您的整個程序包裝在`try`語句中,可能更好的方法是將未捕獲的異常分配給[`sys.excepthook`]( http://docs.python.org/library/sys.html#sys.excepthook)。 – aaronasterling 2010-11-26 22:20:20

回答

0

你可以做的是使用twisted.python和回溯寫入一個文件,它給你一個準確的追蹤,包括異常

+0

還有`traceback`模塊。但我不認爲這是OP想要的。 – knitti 2010-11-26 22:09:54

+0

我不確定那會做我以後的事情。當異常被捕獲時,我可以將traceback轉儲到文件中,但是我真正想要的是一種在事實之後交互式調試程序的方式(就像使用gdb調試核心文件一樣)。 – 2010-11-30 20:52:19

1

據我所知,沒有任何方式做自己「問。這就是說,這聽起來像你可能正在尋找一個遠程調試器。有幾個選項:

  • rconsole - 這不是一個真正的調試器,但它允許您在另一個進程中獲得交互提示。這對調試有用。我沒有嘗試過,但看起來相對簡單。
  • rpdb2's embedded debugger - 這可以讓你啓動一個調試器,然後從另一個shell連接到它。
0

您可以創建在頂層一個完全獨立的執行環境:

myEnv = {} 
myEnv.update(globals) 

然後就是執行環境中執行代碼。如果發生異常,你有回溯(堆棧)和所有全局變量,所以你可以很好地重建程序狀態。

0

目前異常被捕獲,前棧被鬆開,國家可用於與檢查模塊檢查:http://docs.python.org/2/library/inspect.html

一般地你會用你的inspect.getinnerframes追蹤對象。每個堆棧幀中的局部變量都可以作爲.f_locals使用,因此您可以看到它們是什麼。

困難的部分是正確地序列化所有這些:取決於你在本地範圍內有哪些類型,你可以或不可以醃製它們,將它們轉儲到JSON或其他任何類型。

0

我希望這有助於(它幫助我):

import logging, traceback 
_logger = logging.getLogger(__name__) 

try: 
    something_bad() 
except Exception as error: 
    _logger.exception("Oh no!") # Logs original traceback 
    store_exception_somewhere(error) 

此外,in Python 3 there are a few new optionsraise new_exc from original_exc raise OtherException(...).with_traceback(tb)