# Copyright 2013 Eygene A. Ryabinkin
# Functions to perform stack tracing (for multithreaded programs
# as well as for single-threaded ones).

import sys
import threading
import traceback


def dump(out):
    """ Dumps current stack trace into I/O object 'out' """
    id2name = {}
    for th in threading.enumerate():
        id2name[th.ident] = th.name
    n = 0
    for i, stack in list(sys._current_frames().items()):
        out.write("\n# Thread #%d (id=%d), %s\n" % (n, i, id2name[i]))
        n = n + 1
        for f, lno, name, line in traceback.extract_stack(stack):
            out.write('File: "%s", line %d, in %s' % (f, lno, name))
            if line:
                out.write(" %s" % (line.strip()))
            out.write("\n")