<p>I'm trying to debug a deadlock in a multi-threaded Python application after it has locked up.  Is there a way to attach a debugger to inspect the state of the process?  </p>

<p>Edit: I'm attempting this on Linux, but it would be great if there were a cross-platform solution.  It's Python after all :)</p>

What platform are you attempting this on? Most debuggers allow you to attach to a running process by using the process id.
You can either output the process id via logging or using something like Task Manager.
Once that is achieved it will be possible to inspect individual threads and their call stacks.
EDIT: I don't have any experience with GNU Debugger (GDB), which is cross platform, however I found this
link
and it may start you on the right path. It explains how to add debug symbols (handy for reading stack traces) and how to instruct gdb to attach to a running python process.