2010-10-12 2 views
0

Есть ли удобный способ получить более подробную трассировку стека на исключение Python? Я надеюсь найти утилиту/модуль оболочки или какой-либо другой способ получить немного больше информации из трассировки стека без фактического изменения сценария Python, который его генерирует. Я хотел бы иметь возможность использовать это при запуске модульных тестов или доктрин или при запуске утилит или встроенных скриптов из оболочки.Получение дополнительной информации из трассировки стека

В частности, я бы хотел иметь значения локальных переменных или, может быть, просто значения аргументов, переданных самой внутренней функции в трассировке стека. Некоторые варианты установки уровня детализации будут отличными.

ответ

2

не связанные с вашей проблемой, но вы могли бы найти этот код полезным - автоматически запускает отладчик python, когда возникает фатальное исключение. Хорошо подходит для работы с интерактивным кодом. Это родом из ActiveState

# code snippet, to be included in 'sitecustomize.py' 
import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty(): 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 
+0

Эй, спасибо за это. Я закончил обертку вашего кода в [module] (http://pypi.python.org/pypi/coroner), чтобы было удобно вызывать отладку pdb с помощью 'python -m coroner some_script.py'. Умм, надеюсь, что все в порядке? Я дал вам атрибуцию в документах. Я, скорее всего, изменю модуль позже, чтобы выплюнуть трассировки стека, как я их хочу, поэтому мне не нужно выкапывать их с помощью pdb, и поэтому я могу использовать его для модульных тестов и т. Д. Тем временем это может быть полезно кому-то. – intuited

+0

Эй, вы можете сделать это с помощью 'ipython', я просто понял. Вы передаете опцию '-pdb' перед передачей' -c ... 'или имени файла. Кажется, он не поддерживает '-m ...', но, возможно, это можно сделать, передав'/usr/lib/python ../ runpy.py' в качестве имени файла. – intuited

0

Как упоминалось на pyfunc, вы можете использовать функцию в модуле отладочные, но вы получите только StackTrace.

Если вы хотите осмотреть стопку, вы должны использовать функцию sys.exc_info() и пропустить элемент traceback и вывести информацию из своей рамы (tb_frame). См. Python Reference Manual для получения дополнительной информации об этих типах.

Вот пример:

def killit(a): 
    a[10000000000000] = 1 

def test(a): 
    killit(a) 

def iterate_traceback(tb): 
    while tb is not None: 
     yield tb 
     tb = tb.tb_next 

try: 
    test(tuple()) 
except Exception as e: 

    import sys 
    exception_info = sys.exc_info() 

    traceback = exception_info[2] 
    for tb in iterate_traceback(traceback): 
     print "-" * 10 
     print tb.tb_frame.f_code 
     print tb.tb_frame.f_locals 
     print tb.tb_frame.f_globals 
Смежные вопросы