2016-04-12 24 views
5

varsayalım ben beklenmedik durumları yükselten bir işlevi var, bu yüzden ipdb sarın:Yerel değişkenleri yığın izlemeden nasıl çıkarabilirim?

Ben x ve y değerleri ne olduğunu öğrenmek için yığını yukarı hareket edebilir
def boom(x, y): 
    try: 
     x/y 
    except Exception as e: 
     import ipdb; ipdb.set_trace() 

def main(): 
    x = 2 
    y = 0 
    boom(x, y) 

if __name__ == '__main__': 
    main() 

vardır: Ancak

$ python crash.py 
> /tmp/crash.py(6)boom() 
     5  except Exception as e: 
----> 6   import ipdb; ipdb.set_trace() 
     7 

ipdb> u 
> /tmp/crash.py(11)main() 
    10  y = 0 
---> 11  boom(x, y) 
    12 

ipdb> p y 
0 

ayıklarken, ben sadece en üst düzeyinde bir hata ayıklayıcı koymak istiyorum: Ben Traceback görüntüleyebilir

def boom(x, y): 
    x/y 

def main(): 
    x = 2 
    y = 0 
    boom(x, y) 

if __name__ == '__main__': 
    try: 
     main() 
    except Exception as e: 
     import ipdb; ipdb.set_trace() 

ama denilen işlevi içinde değişkenleri görüntüleyemezsiniz:

$ python crash.py 
> /tmp/crash.py(14)<module>() 
    12   main() 
    13  except Exception as e: 
---> 14   import ipdb; ipdb.set_trace() 

ipdb> !import traceback; traceback.print_exc(e) 
Traceback (most recent call last): 
    File "crash.py", line 12, in <module> 
    main() 
    File "crash.py", line 8, in main 
    boom(x, y) 
    File "crash.py", line 3, in boom 
    x/y 
ZeroDivisionError: integer division or modulo by zero 
ipdb> d # I want to see what value x and y had! 
*** Newest frame 

Kural dışı durum nesnesi, istisna oluştuğunda yığında açıkça referanslar içerir. Yığının açılmamış olmasına rağmen x ve y'a buradan erişebilir miyim?

cevap

3

Bir geri tepme nesnesinden değişkenler çıkarmak mümkün olduğunu ortaya çıkarır.

elle değerlerini çıkarmak için: kusurlu koduna düz bizi alır

import sys 

def boom(x, y): 
    x/y 

def main(): 
    x = 2 
    y = 0 
    boom(x, y) 

if __name__ == '__main__': 
    try: 
     main() 
    except Exception as e: 
     # Most debuggers allow you to just do .post_mortem() 
     # but see https://github.com/gotcha/ipdb/pull/94 
     tb = sys.exc_info()[2] 
     import ipdb; ipdb.post_mortem(tb) 

:

ipdb> !import sys 
ipdb> !tb = sys.exc_info()[2] 
ipdb> p tb.tb_next.tb_frame.f_locals 
{'y': 0, 'x': 2} 

Daha da iyisi, açıkça bu yığında otopsi hata ayıklama yapmak istisna kullanabilirsiniz :

> /tmp/crash.py(4)boom() 
     3 def boom(x, y): 
----> 4  x/y 
     5 

ipdb> p x 
2 
İlgili konular