2015-12-21 24 views
3

我想調試代碼執行時發生的警告。如何在警告時自動切換到調試模式?

一個簡單的斷點不會這樣做,因爲在發生第一個警告之前,導致警告的那一行會在沒有警告的情況下執行數百萬次。

此外,發生這種情況的行是在庫代碼中(更準確地說,在pandas/core/common.py),所以我的首選是根本不修改代碼。

我只想在發出警告時停止程序的執行權,並在此時檢查堆棧,使用pdbipdb

有沒有辦法配置調試器在發出警告時自動進入單步模式?

+0

你的意思是說,如果你在那時插入'import pdb; pdb.set_trace()',基本上會發生什麼? –

+0

@ Two-BitAlchemist:是的,除此之外,我寫的是,我不想真正修改正在調試的代碼。 – kjo

+0

警告是警告,不是例外。調試器不會撿起它。通常你要麼改變代碼來防止警告,要麼按照下面的描述壓制它:https://docs.python.org/2/library/warnings.html。如果您需要特定警告的幫助,只需詢問! –

回答

3

您可以編寫一個腳本dbg.py

import pdb, warnings, sys 
import __builtin__ 

if __name__ == '__main__': 
    args, n = [], len(sys.argv) 
    if n < 2: 
     sys.exit(1) 
    elif n > 2: 
     args.append(__builtin__.__dict__[sys.argv[2]]) 
     if n > 3: 
      args.append(int(sys.argv[3])) 
    warnings.simplefilter('error', *args) # treat warnings as exceptions 
    try: 
     execfile(sys.argv[1]) 
    except: 
     pdb.post_mortem(sys.exc_info()[-1]) 

然後,您可以使用它來調試腳本這樣。在你的腳本名稱作爲第一個參數傳遞,如果你想在任何警告的情況下PDB:

$ python dbg.py yourscript.py 

通在預警類型的第二個參數,如果你只希望在警告某些特定類型的提高PDB運行:

$ python dbg.py yourscript.py DeprecationWarning 

行號作爲第三個參數:

$ python dbg.py yourscript.py DeprecationWarning 342 

您也可以使用warnings.filterwarnings重寫代碼,而不是warnings.simplefilter使警告過濾更靈活。

0

https://pypi.python.org/pypi/rpdb/

我發現rpdb非常方便調試這樣的問題,當你沒有啓動該程序的控制。你需要的是臨時修改pandas/core/common.py添加

import rpdb 
debugger = rpdb.Rpdb(port=12345) 
debugger.set_trace() 

被觸發報警時,調試器會在那裏等待連接。然後連接到調試器並檢查堆棧。

相關問題