Full stack trace in pdb.post_mortem() ?

John W jwdevel at gmail.com
Fri Nov 1 12:48:37 EDT 2019


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

For this contrived example, I can put `breakpoint()` instead of
`post_mortem()`, and get what I want.

But I feel like I'm misunderstanding post-mortem debugging.
Is the full call stack simply not available?

Note: I am aware that I can *print* the full stack trace (including
`main()`), even if it takes some special effort. See these posts:

* https://stackoverflow.com/questions/13210436/get-full-traceback/
* https://stackoverflow.com/questions/6086976/how-to-get-a-complete-exception-stack-trace-in-python

----

[1] https://stackoverflow.com/questions/58653016/get-full-backtrace-with-pdb-post-mortem


More information about the Python-list mailing list