将程序计数器样本转换为(g)prof输入数据

时间:2015-11-05 20:59:50

标签: arm profiling cortex-m3 gprof

我从ARM Cortex M3收集程序计数器样本。像这样的长列表:

  1. 0x8005b2a
  2. 0x8001324
  3. 0x8005b34
  4. 0x8001318
  5. 定期对电脑进行采样。我现在想要从正在运行的程序中获得静态平面配置文件。就像(g)教授正在支持linux内核。

    有没有办法以(g)prof可读格式转换这些PC样本,还是有其他工具可以根据这些pc样本和* .elf / * .lst文件给我一个配置文件?

1 个答案:

答案 0 :(得分:0)

HansMüller,据我所知,gprof格式生成起来并不容易(https://sourceware.org/binutils/docs/gprof/File-Format.html - “新文件格式在头文件gmon_out.h中定义。它包含一个包含魔术cookie和版本的标题number,...直方图记录由一个标题组成,后面跟着一个二进制数组......“)

我可以建议生成

更简单的方法(对于平面)是使用来自binutils的一些awk / perl / python脚本和addr2line工具(您需要支持目标架构的addr2line) 。此工具将为您提供地址中的函数名称(如果您正确地将PC示例映射到elf二进制文件的虚拟地址),并且您的脚本应该为每个函数求和样本,然后进行排序。在小脚本中处理callgraph更难。

gpreftools的pprof只是可以为你运行addr2line的脚本(你仍然需要addr2line的正确变体)。它能够为函数和排序求和样本,甚至可以调用objdump来进行带注释的反汇编。

两种格式都可用于平面轮廓,但它们支持某种程度的调用图。 pprof允许您在每个事件中保存完整的回溯;而callgrind.out格式只存储对caller-callee(cfn),而kcachegrind可能错误地猜测pathes到热代码。