When an error occurs you can start using the debugger by creating a cell with the content %debug
and execute it.
Please remove this cell from the notebook once done with debugging as it breaks the marking system!
%debug
This is a command prompt, you can use command in it to navigate.
p
or print
to print a variablel
or list
to show the codeu
or up
to move up the stackd
or down
to move down the stackw
or where
to show the call stackq
or quit
to quit, not optional!h
or help
to get helpLet’s us an example
def onlyForPositive(x):
assert x > 0
return 2*x
def first(x):
a = 1
return second(x + a )
def second(x):
b = "Important text"
return third(2*x)
def third(x):
return onlyForPositive(x)
Let’s set off the trap…
first(-9)
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-3-507e734bd062> in <module>
----> 1 first(-9)
<ipython-input-2-67307958987f> in first(x)
1 def first(x):
2 a = 1
----> 3 return second(x + a )
4
5 def second(x):
<ipython-input-2-67307958987f> in second(x)
5 def second(x):
6 b = "Important text"
----> 7 return third(2*x)
8
9 def third(x):
<ipython-input-2-67307958987f> in third(x)
8
9 def third(x):
---> 10 return onlyForPositive(x)
<ipython-input-1-f984f816e072> in onlyForPositive(x)
1 def onlyForPositive(x):
----> 2 assert x > 0
3 return 2*x
AssertionError:
This is the call stack: a succession of functions calling each other.
Each “layer” on the stack is a function call, it is called a frame.
If you call the debugger, you get a command prompt:
You can navigate though the call trace using up
and down
.
You can print the call stack in the debugger using where
.
You can print all variable accessible in a frame, and even execute code.
%debug
> [0;32m<ipython-input-1-f984f816e072>[0m(2)[0;36monlyForPositive[0;34m()[0m
[0;32m 1 [0;31m[0;32mdef[0m [0monlyForPositive[0m[0;34m([0m[0mx[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m----> 2 [0;31m [0;32massert[0m [0mx[0m [0;34m>[0m [0;36m0[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m 3 [0;31m [0;32mreturn[0m [0;36m2[0m[0;34m*[0m[0mx[0m[0;34m[0m[0;34m[0m[0m
[0m
ipdb> q
You can also decide where to call the debugger in the code, so you can be more proactive:
from IPython.core.debugger import set\_trace
def onlyForPositive(x):
if x <= 0:
set\_trace()
assert x > 0
return 2*x
You can now investigate and even fix the value of x
if you want!
first(-9)
> [0;32m<ipython-input-10-214f66a1f148>[0m(4)[0;36monlyForPositive[0;34m()[0m
[0;32m 1 [0;31m[0;32mdef[0m [0monlyForPositive[0m[0;34m([0m[0mx[0m[0;34m)[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m 2 [0;31m [0;32mif[0m [0mx[0m [0;34m<=[0m [0;36m0[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m 3 [0;31m [0mset\_trace[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m----> 4 [0;31m [0;32massert[0m [0mx[0m [0;34m>[0m [0;36m0[0m[0;34m[0m[0;34m[0m[0m
[0m[0;32m 5 [0;31m [0;32mreturn[0m [0;36m2[0m[0;34m*[0m[0mx[0m[0;34m[0m[0;34m[0m[0m
[0m
ipdb> q
---------------------------------------------------------------------------
BdbQuit Traceback (most recent call last)
<ipython-input-11-507e734bd062> in <module>
----> 1 first(-9)
<ipython-input-2-67307958987f> in first(x)
1 def first(x):
2 a = 1
----> 3 return second(x + a )
4
5 def second(x):
<ipython-input-2-67307958987f> in second(x)
5 def second(x):
6 b = "Important text"
----> 7 return third(2*x)
8
9 def third(x):
<ipython-input-2-67307958987f> in third(x)
8
9 def third(x):
---> 10 return onlyForPositive(x)
<ipython-input-10-214f66a1f148> in onlyForPositive(x)
2 if x <= 0:
3 set\_trace()
----> 4 assert x > 0
5 return 2*x
<ipython-input-10-214f66a1f148> in onlyForPositive(x)
2 if x <= 0:
3 set\_trace()
----> 4 assert x > 0
5 return 2*x
/usr/lib64/python3.7/bdb.py in trace\_dispatch(self, frame, event, arg)
86 return # None
87 if event == 'line':
---> 88 return self.dispatch\_line(frame)
89 if event == 'call':
90 return self.dispatch\_call(frame, arg)
/usr/lib64/python3.7/bdb.py in dispatch\_line(self, frame)
111 if self.stop\_here(frame) or self.break\_here(frame):
112 self.user\_line(frame)
--> 113 if self.quitting: raise BdbQuit
114 return self.trace\_dispatch
115
BdbQuit:
The debugger can be turned on automatically when you encounter an error using
%pdb
Automatic pdb calling has been turned ON
Calling the same command again turns it off:
%pdb
Automatic pdb calling has been turned OFF