Tracing python code
I have used this to figure out what is happening in complex pieces of software, such as Plone.
The hook is set via the sys.settrace() function. This takes a function which is called during any of several events. One is the "line" event. Before the interpreter executes a line it calls the trace function with the current frame and the string "line". (The function gets a third argument which is None; that fields is used by other events.
import sys import linecache def traceit(frame, event, arg): if event == "line": lineno = frame.f_lineno filename = frame.f_globals["__file__"] if (filename.endswith(".pyc") or filename.endswith(".pyo")): filename = filename[:-1] name = frame.f_globals["__name__"] line = linecache.getline(filename, lineno) print "%s:%s: %s" % (name, lineno, line.rstrip()) return traceit
You start the tracing by calling the function defined above:
sys.settrace(traceit)
...and then your code follows.
Read more: Tracing python code, Tracing a Program As It Runs - Python Module of the Week
Here is a version I made some years ago, that probably works. It seems to track function calls:
def traceit(frame, event, arg): fo = open('/tmp/recur_log','a') if event != 'call': return co = frame.f_code func_name = co.co_name if func_name == 'write': # Ignore write() calls from print statements return func_line_no = frame.f_lineno func_filename = co.co_filename caller = frame.f_back caller_line_no = caller.f_lineno caller_filename = caller.f_code.co_filename fo.write( 'Call to %s on line %s of %s from line %s of %s\n' % (func_name, func_line_no, func_filename, caller_line_no, caller_filename)) fo.close() return traceit
It doesn't seem to extract the module name though, can be done with:
name = frame.f_globals["__name__"]