17.2.7.3 监视栈
使用hook的另一方法是跟踪正则调用哪些函数,以及它们的返回值是什么。为了监视返回值,可以监视return事件。
#!usr/bin/env python3
# encoding: utf-8
import sys
def trace_calls_and_returns(frame,event,arg):
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
if event == 'call':
print('* Call to {} on line {} of {}'.format(
func_name,line_no,filename))
return trace_calls_and_returns
elif event == 'return':
print('* {} => {}'.format(
func_name,arg))
return
def b():
print('inside b()')
return 'response_from_b'
def a():
print('inside a()')
val = b()
return val * 2
sys.settrace(trace_calls_and_returns)
a()
局部跟踪函数用于监视返回事件,这说明调用一个函数时trace_calls_and_returns()需要返回自身的一个引用,从而能监视返回值。