如何从perf.data重构带真实运行时地址的PIE可执行文件
实现带运行时真实地址的类perf annotate输出方案
方案1:使用perf annotate原生参数(最简便)
perf本身自带显示虚拟地址的参数,无需额外工具:
- 采样阶段正常执行带分支栈的录制:
perf record -b -g ./your_target_binary - 注释阶段添加
--show-addr和--asm-raw参数即可输出带真实运行时虚拟地址的汇编列表,格式和objdump完全一致,同时附带采样计数:perf annotate --show-addr --asm-raw <可选:指定目标函数名> - 如果要完全跳过objdump调用,使用perf内置的汇编解析逻辑,可以额外添加
--objdump=""参数,5.8及以上内核版本均支持该特性。
方案2:perf script二次加工(高自定义)
如果需要自定义输出格式,可以基于你已经拿到的brstack数据处理:
- 执行导出命令拿到全量原始地址和指令数据:
perf script -F ip,sym,brstack -D > perf_raw_dump.txt - 用简单的awk或python脚本对相同函数内的地址做升序排序,合并同一地址的采样计数,再按地址顺序输出地址、采样数、汇编指令即可得到自定义格式的类objdump输出。
方案3:使用bcc工具集(无perf依赖)
Ubuntu 20.04官方源自带的bcc工具集也可以实现该需求:
- 先安装依赖:
apt install -y bcc bcc-tools linux-headers-$(uname -r) - 使用
funccount工具的地址统计功能:funccount -a -r '^your_function_name$' -d <采样时长秒数> ./your_target_binary - 输出会直接返回每个指令运行时地址的命中次数,和objdump的汇编输出做地址匹配即可得到带采样数据的注释结果。
注意:你使用的5.11内核和Ubuntu 20.04环境已经原生支持上述所有功能,无需编译内核或上游工具源码。
内容的提问来源于stack exchange,提问作者Noah
相关产品推荐
相关产品推荐

