2016-11-10 1 views
1

J'essaie de comprendre comment utiliser la méthode pdb .post_mortem().comment utiliser la méthode post_mortem de pdb?

pour ce fichier donné

# expdb.py 
import pdb 
import trace 

def hello(): 
    a = 6 * 9 
    b = 7 ** 2 
    c = a * b 
    d = 4/0 
    print(c) 

tracer = trace.Trace() 

invite de commande

''' 
# first Try 

λ python -i expdb.py 
>>> pdb.post_mortem() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files\Anaconda3\lib\pdb.py", line 1590, in post_mortem 
    raise ValueError("A valid traceback must be passed if no " 
ValueError: A valid traceback must be passed if no exception is being handled 
''' 

''' 
# Second Try 

λ python -i expdb.py 
>>> pdb.post_mortem(traceback=tracer.run('hello()')) 
--- modulename: trace, funcname: _unsettrace 
trace.py(77):   sys.settrace(None) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Program Files\Anaconda3\lib\trace.py", line 500, in run 
    self.runctx(cmd, dict, dict) 
    File "C:\Program Files\Anaconda3\lib\trace.py", line 508, in runctx 
    exec(cmd, globals, locals) 
    File "<string>", line 1, in <module> 
    File "expdb.py", line 8, in hello 
    d = 4/0 
ZeroDivisionError: division by zero 
>>> 

Répondre

3

La méthode post_mortem veut un objet retraçage, pas de trace objet. Les objets de traçage peuvent être acquis à partir de sys.exec_info()[2] à l'intérieur d'un bloc except, ou vous pouvez simplement appeler pdb.post_mortem() sans arguments directement (dans le bloc except).

Mais de toute façon, vous devez intercepter l'exception avant de pouvoir la déboguer.

+0

Merci Kevin. Mon prochain module à apprendre sera suivi –