17.2.7.2 跟踪内部函数
跟踪hook可以返回一个新hook,并在新作用域中使用(局部跟踪函数)。例如,可以控制跟踪,使其只在某些模块或函数中逐行运行。
#!/usr/bin/env python3
# encoding: utf-8
import functools
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
print('* {} line {}'.format(func_name,line_no))
def trace_calls(frame,event,arg,to_be_traced):
if event != 'call':
return
co = frame.f_code
func_name = co.co_name
if func_name == 'write':
# Ignore write() calls from printing.
return
line_no = frame.f_lineno
filename = co.co_filename
print('* Call to {} on line {} of {}'.format(
func_name,line_no,filename))
if func_name in to_be_traced:
# Trace into this function.
return trace_lines
return
def c(input):
print('input =',input)
print('Leaving c()')
def b(arg):
val = arg * 5
c(val)
print('Leaving b()')
def a():
b(2)
print('Leaving a()')
tracer = functools.partial(trace_calls,to_be_traced=['b'])
sys.settrace(tracer)
a()
在这个例子中,函数列表被保存在变量to_be_traced内,所以在trace_calls()运行时,它能返回trace_lines()以启用b()内部的跟踪。