PDB: исключение в консоли — полная трассировка стека

В консоли pdb ввод оператора, который вызывает исключение, приводит к трассировке стека только одной строки, например.

(Pdb) someFunc()
*** TypeError: __init__() takes exactly 2 arguments (1 given)

Однако я хотел бы выяснить, где именно в someFunc возникает ошибка. то есть в данном случае, к какому классу __init__ привязан.

Есть ли способ получить полную трассировку стека в Pdb?


person EoghanM    schedule 02.05.2010    source источник


Ответы (2)


Самый простой способ — определить в коде функцию, которая вызывает someFunc() и печатает трассировку, а затем вызывает ее из Pdb.

В качестве альтернативы вы можете распечатать трассировку для себя. Учитывая этот исходный код:

def foo(a):
    pass

def bar(b):
    foo(b, 2)

def some_func():
    bar(3)

if __name__=='__main__':
    import pdb
    pdb.set_trace()

Тогда мы можем сделать это:

C:\temp>test.py
--Return--
> c:\temp\test.py(12)<module>()->None
-> pdb.set_trace()
(Pdb) import traceback
(Pdb) exec "try: some_func()\nexcept: traceback.print_exc()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\temp\test.py", line 8, in some_func
    bar(3)
  File "C:\temp\test.py", line 5, in bar
    foo(b, 2)
TypeError: foo() takes exactly 1 argument (2 given)
(Pdb)
person Duncan    schedule 03.05.2010
comment
Есть ли способ сделать это автоматически? - person Giampaolo Rodolà; 04.12.2013

pdb поддерживает операторы debug для рекурсивного вызова:

$ nosetests xxxx -x --pdb
-> some code line with error
(Pdb) debug os.sdfafa()  # something that raises exception
ENTERING RECURSIVE DEBUGGER
> <string>(1)<module>()  # new line that raised excetion
((Pdb))  # number of parentheses indicates debugger recusion depth
((Pdb)) debug os.someothersdfsdf()
ENTERING RECURSIVE DEBUGGER
> <string>(1)<module>()
(((Pdb))) 
person Dima Tisnek    schedule 02.04.2014