forked from Rookout/pycon-debugging-internals
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathadvanced_trace_callback.py
55 lines (48 loc) · 1.34 KB
/
advanced_trace_callback.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import sys
def trace_lines(frame, event, arg):
if event != 'line':
return
co = frame.f_code
func_name = co.co_name
line_no = frame.f_lineno
filename = co.co_filename
print 'Executing line %s in func %s' % (line_no, func_name)
def trace_exceptions(frame, event, arg):
if event != 'exception':
return
co = frame.f_code
func_name = co.co_name
line_no = frame.f_lineno
filename = co.co_filename
exc_type, exc_value, exc_traceback = arg
print 'Tracing exception: %s "%s" on line %s of %s' % \
(exc_type.__name__, exc_value, line_no, func_name)
def tracer(frame, event, arg):
co = frame.f_code
func_name = co.co_name
line_no = frame.f_lineno
filename = co.co_filename
if event == 'call':
print 'Call to %s on line %s of %s' % (func_name, line_no, filename)
elif event == 'line':
trace_lines(frame, event, arg)
elif event == 'return':
print '%s => %s' % (func_name, arg)
elif event == 'exception':
trace_exceptions(frame, event ,arg)
return tracer
def c():
raise RuntimeError('generating exception in c()')
def b():
print 'in b()'
c()
return 'response_from_b'
def a():
print 'in a()'
val = b()
return val * 2
sys.settrace(tracer)
try:
a()
except Exception, e:
print 'Exception handler:', e