第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-跟踪内部函数

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()内部的跟踪。
第十七章:运行时特性-sys:系统特定配置-跟踪程序运行情况-跟踪内部函数

上一篇:Centos7 docker安装GitLab


下一篇:libcoro:在c++中支持coroutine