Skip to content

Instantly share code, notes, and snippets.

@focusj
Last active February 10, 2020 05:57
Show Gist options
  • Save focusj/66fb040ef5fcd9b58e935cf082907a82 to your computer and use it in GitHub Desktop.
Save focusj/66fb040ef5fcd9b58e935cf082907a82 to your computer and use it in GitHub Desktop.
获取python stack信息

How to get a stack trace for each thread in a running python script

Sometimes a python script will simply hang forever with no indication of where things went wrong. Perhaps it's polling a service that will never return a value that allows the program to move forward. Here's a way to see where the program is currently stuck.

Install gdb and pyrasite

Install gdb.

# Redhat, CentOS, etc
$ yum install gdb

# Ubuntu, Debian, etc
$ apt-get update && apt-get install gdb

Install pyrasite.

$ pip install pyrasite

Inspect process with pyrasite

Find the process ID for the stuck python process and run pyrasite-shell with it.

# Assuming process ID is 12345
$ pyrasite-shell 12345

You should now see a python REPL. Run the following in the REPL to see stack traces for all threads.

import sys, traceback
for thread_id, frame in sys._current_frames().items():
    print 'Stack for thread {}'.format(thread_id)
    traceback.print_stack(frame)
    print ''

and another script:

import sys, threading
def stacking():
    print("\n*** STACKTRACE - START ***\n")
    code = []
    for threadId, stack in sys._current_frames().items():
        threadName = ''
        for t in threading.enumerate():
            if t.ident == threadId:
                threadName = t.name
        code.append("\n# ThreadID: %s %s" % (threadId, threadName))
        for filename, lineno, name, line in traceback.extract_stack(stack):
            code.append('File: "%s", line %d, in %s' % (filename, lineno, name))
            if line:
                code.append("  %s" % (line.strip()))
    for line in code:
        print(line)
    print("\n*** STACKTRACE - END ***\n") 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment