Python动态追踪函数执行并提取相关代码的实用技巧

一、背景需求

在日常开发中,我们经常需要分析一个程序的执行路径。例如:当执行某个入口函数时,实际调用了哪些自定义函数和类?如何自动提取这些被执行的代码片段?这在代码审计、依赖分析等场景下非常有用。

二、解决方案概述

本方案基于Python标准库中的trace模块,通过以下步骤实现动态追踪和代码提取:

  1. 动态追踪:记录函数执行过程中所有被执行代码的位置
  2. 路径过滤:排除系统库等无关文件(以/usr开头的路径)
  3. 代码分析:通过AST解析识别被执行的类和函数
  4. 代码提取:根据执行记录提取完整的代码块

三、关键技术解析

3.1 动态追踪技术

使用trace.Trace类进行执行追踪:

tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix, '/usr'],  # 排除系统路径
    trace=False,  # 不生成详细跟踪信息
    count=True    # 启用行号统计
)
tracer.runfunc(main)

这里的关键参数说明:

  • ignoredirs:过滤不需要追踪的目录
  • trace=False:避免生成冗余的跟踪日志
  • count=True:统计被执行的行号信息

执行后会生成results对象,其中包含详细的执行统计信息。

3.2 AST代码解析

抽象语法树(AST)是解析代码结构的利器。我们通过它来精确识别代码中的类和函数定义:

import ast

with open(filename, 'r') as f:
    source = f.read()
tree = ast.parse(source)  # 生成AST树

遍历AST节点的示例:

for node in tree.body:
    if isinstance(node, ast.ClassDef):
        # 处理类定义
    elif isinstance(node, ast.FunctionDef):
        # 处理函数定义

3.3 执行范围判断

通过对比AST节点位置与执行记录,判断代码块是否被执行:

# 假设已收集到被执行行号集合linenos
func_lines = set(range(item.lineno, item.end_lineno + 1))
if func_lines.intersection(linenos):
    # 该函数/类需要被提取

这里用range生成代码块的行号范围,通过与实际执行行号的交集判断是否需要提取。

四、完整实现步骤

def main():
    #你的代码

import sys
import os
import trace
import ast
from collections imp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi20240217

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值