Using the python debugger¶
Unfortunately this doesn't work nicely in the notebook. But from the command line, you can run a python program with:
python -m pdb my_program.py
Basic navigation:¶
Basic command to navigate the code and the python debugger:
help
: prints the helphelp n
: prints help about commandn
n
(ext): executes one line of code. Executes and steps over functions.s
(tep): step into current function in line of codel
(ist): list program around current positionw
(where): prints current stack (where we are in code)[enter]
: repeats last commandanypythonvariable
: print the value of that variable
The python debugger is a python shell: it can print and compute values, and even change the values of the variables at that point in the program.
Breakpoints¶
Break points tell debugger where and when to stop We say
b somefunctionname
In [1]:
%%writefile solutions/diffusionmodel/energy_example.py
from diffusion_model import energy
print(energy([5, 6, 7, 8, 0, 1]))
The debugger is, of course, most used interactively, but here I'm showing a prewritten debugger script:
In [2]:
%%writefile commands
restart # restart session
n
b energy # program will stop when entering energy
c # continue program until break point is reached
print(density) # We are now "inside" the energy function and can print any variable.
In [3]:
%%bash
python -m pdb solutions/diffusionmodel/energy_example.py < commands
Alternatively, break-points can be set on files: b file.py:20
will stop on line 20 of file.py
.
Post-mortem¶
Debugging when something goes wrong:
- Have a crash somewhere in the code
- run
python -m pdb file.py
or run the cell with%pdb on
The program should stop where the exception was raised
- use
w
andl
for position in code and in call stack - use
up
anddown
to navigate up and down the call stack - inspect variables along the way to understand failure
This does work in the notebook.
%pdb on
from diffusion.model import energy
partial_derivative(energy,[5,6,7,8,0,1],5)