In Python pdb, can I limit number of stack levels shown by "where", around my current position in the stack?
In my specific use case, I want to investigate an maximum recursion problem, where the original problem is maybe on stack level 20, but the stack trace shows all 500 levels.
I know I can set the recursion limit to a lower value, but it would be nicer if I could simply show the surrounding n levels around the current level.
look at traceback
traceback.print_stack()
where you can specify a limit and that one can be positive (in that case you will be 'polluted' by the pdb calls, so add like 10 on the expected number in case of a breakpoint()
) or negative to refer from the top or the bottom of the stack.traceback.format_stack()
whose return the stack as a list, pdb limit commands on one line but you can print all or the expected part of the list doing for instance {print(_, end='') for _ in traceback.format_stack()[-30:-10]}
to print the top 20 calls without the 'pollution' of the 10 internal calls of pdb I have when I put a breakpoint()
in a function.{...}
to just get the short value {None}
whose do not perturb nor hide the print lines.Notice when you are in (Pdb)
you are allowed to do import traceback
.
Having
bruno@raspberrypi:~ $ python
Python 3.11.2 (main, Apr 28 2025, 14:11:48) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb
>>>
>>> def a():
... b()
...
>>> def b():
... c()
...
>>> def c():
... d()
...
>>> def d():
... e(5)
...
>>> def e(n):
... if n == 0:
... breakpoint()
.. else:
... e(n-1)
...
>>> a()
--Return--
> <stdin>(3)e()->None
(Pdb) import traceback
Examples with traceback.format_stack()
:
(Pdb) {print(_, end='') for _ in traceback.format_stack()[-19:-10]}
File "<stdin>", line 2, in a
File "<stdin>", line 2, in b
File "<stdin>", line 2, in c
File "<stdin>", line 2, in d
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
[Previous line repeated 2 more times]
File "<stdin>", line 3, in e
{None}
(Pdb) {print(_, end='') for _ in traceback.format_stack()[-17:-10]}
File "<stdin>", line 2, in c
File "<stdin>", line 2, in d
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
[Previous line repeated 2 more times]
File "<stdin>", line 3, in e
{None}
(Pdb)
Examples with traceback.print_stack()
:
(Pdb) traceback.print_stack()
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in a
File "<stdin>", line 2, in b
File "<stdin>", line 2, in c
File "<stdin>", line 2, in d
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
[Previous line repeated 2 more times]
File "<stdin>", line 3, in e
File "/usr/lib/python3.11/bdb.py", line 94, in trace_dispatch
return self.dispatch_return(frame, arg)
File "/usr/lib/python3.11/bdb.py", line 153, in dispatch_return
self.user_return(frame, arg)
File "/usr/lib/python3.11/pdb.py", line 372, in user_return
self.interaction(frame, None)
File "/usr/lib/python3.11/pdb.py", line 435, in interaction
self._cmdloop()
File "/usr/lib/python3.11/pdb.py", line 400, in _cmdloop
self.cmdloop()
File "/usr/lib/python3.11/cmd.py", line 138, in cmdloop
stop = self.onecmd(line)
File "/usr/lib/python3.11/pdb.py", line 500, in onecmd
return cmd.Cmd.onecmd(self, line)
File "/usr/lib/python3.11/cmd.py", line 216, in onecmd
return self.default(line)
File "/usr/lib/python3.11/pdb.py", line 459, in default
exec(code, globals, locals)
File "<stdin>", line 1, in <module>
(Pdb) traceback.print_stack(None, 15)
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
[Previous line repeated 1 more time]
File "<stdin>", line 3, in e
File "/usr/lib/python3.11/bdb.py", line 94, in trace_dispatch
return self.dispatch_return(frame, arg)
File "/usr/lib/python3.11/bdb.py", line 153, in dispatch_return
self.user_return(frame, arg)
File "/usr/lib/python3.11/pdb.py", line 372, in user_return
self.interaction(frame, None)
File "/usr/lib/python3.11/pdb.py", line 435, in interaction
self._cmdloop()
File "/usr/lib/python3.11/pdb.py", line 400, in _cmdloop
self.cmdloop()
File "/usr/lib/python3.11/cmd.py", line 138, in cmdloop
stop = self.onecmd(line)
File "/usr/lib/python3.11/pdb.py", line 500, in onecmd
return cmd.Cmd.onecmd(self, line)
File "/usr/lib/python3.11/cmd.py", line 216, in onecmd
return self.default(line)
File "/usr/lib/python3.11/pdb.py", line 459, in default
exec(code, globals, locals)
File "<stdin>", line 1, in <module>
(Pdb) traceback.print_stack(None, -15)
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in a
File "<stdin>", line 2, in b
File "<stdin>", line 2, in c
File "<stdin>", line 2, in d
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
File "<stdin>", line 5, in e
[Previous line repeated 2 more times]
File "<stdin>", line 3, in e
File "/usr/lib/python3.11/bdb.py", line 94, in trace_dispatch
return self.dispatch_return(frame, arg)
File "/usr/lib/python3.11/bdb.py", line 153, in dispatch_return
self.user_return(frame, arg)
File "/usr/lib/python3.11/pdb.py", line 372, in user_return
self.interaction(frame, None)
File "/usr/lib/python3.11/pdb.py", line 435, in interaction
self._cmdloop()