pythonpdb

Limit number of stack levels shown


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.


Solution

  • look at traceback

    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()