Full stack trace in pdb.post_mortem() ?

dieter dieter at handshake.de
Mon Nov 4 01:35:37 EST 2019


John W <jwdevel at gmail.com> writes:
> I'm trying to understand pdb.post_mortem(), and why the backtrace
> available in the debugger session seems limited.
>
> I posted a similar question on stackoverflow[1], but figured I'd try
> here as well.
>
> Here's a simple program
>
>     import pdb
>
>     def inner():
>         raise Exception("bad stuff")
>
>     def outer():
>         try:
>             inner()
>         except Exception as ex:
>             pdb.post_mortem()
>             # using breakpoint() gives the full stack trace, of course
>
>     def main():
>         outer()
>
>     main()
>
> When I run that, I get put in the debugger.
> Then, if I run the `bt` command to get a backtrace, I see:
>
>     (Pdb) bt
>       /path/to/script(10)outer()
>     -> inner()
>     > /path/to/script(6)inner()
>     -> raise Exception("bad stuff")
>
> As you can see, the backtrace only has `outer()` and `inner()`.
> What happened to `main()`?

"post_mortem" shows you the traceback from the frame where the exception
occured until the current frame. Because you called "post_mortem"
in "outer", the display will stop there (and do not include "main").

>I want the full stack available, so I can
> investigate variables, etc. at any point along the chain.
> (in a real example, there might be quite a lot of additional call
> frames of interest)

Then use "pdb.set_trace" instead of "pdb.post_mortem".



More information about the Python-list mailing list