Получение более подробной информации от трассировки стека - PullRequest
0 голосов
/ 12 октября 2010

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

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

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Не относится конкретно к вашей проблеме, но вы можете найти этот код полезным - автоматически запускает отладчик 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 голосов
/ 29 июля 2011

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

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

Вот пример:

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
0 голосов
/ 12 октября 2010
...