Tim
Tim

Reputation: 99428

Using pdb, how can I run a program and pause where reaching an error?

Using python interpreter and/or pdb, can we run a program and pause whenever reaching an error, so that I can examine all the frames of the call stack of the program at the time of crashing?

When I run a program directly inside python interpreter, when reaching an error, it tells where the line of code it happens, but it seems return to the topmost frame, and I can't examine the frame where the error actually happens. E.g.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 194, in <module>
    addlevel(root_toc, 0)
  File "test.py", line 191, in addlevel
    addlevel(child, root_level+1)
  File "test.py", line 188, in addlevel
    root.value.append(root_level)
AttributeError: 'str' object has no attribute 'append'
>>> root_level
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'root_level' is not defined

The error happens at the lowest frame, and I can't examine the value of root_level at that frame. Is it because it returns to the topmost frame after the error happens? How can examine the lowest frame?

THanks.

Upvotes: 3

Views: 841

Answers (1)

davidism
davidism

Reputation: 127190

Run pdb as a module, passing the script you want to debug. It will break on abnormal exits. (This is mentioned early in the docs.)

python -m pdb my_script.py

If you're in the interpreter, you can use pdb.pm() to debug the last traceback.


Or, use the IPython interpreter. Typing debug after an uncaught exception will enter a pdb session for the last traceback, similar to pm().

Upvotes: 7

Related Questions