我从ARM Cortex M3收集程序计数器样本。像这样的长列表:
定期对电脑进行采样。我现在想要从正在运行的程序中获得静态平面配置文件。就像(g)教授正在支持linux内核。
有没有办法以(g)prof可读格式转换这些PC样本,还是有其他工具可以根据这些pc样本和* .elf / * .lst文件给我一个配置文件?
答案 0 :(得分:0)
HansMüller,据我所知,gprof格式生成起来并不容易(https://sourceware.org/binutils/docs/gprof/File-Format.html - “新文件格式在头文件gmon_out.h中定义。它包含一个包含魔术cookie和版本的标题number,...直方图记录由一个标题组成,后面跟着一个二进制数组......“)
我可以建议生成
pprof
工具 - https://gperftools.googlecode.com/git/doc/cpuprofile-fileformat.html)或kcachegrind
GUI工具 - http://valgrind.org/docs/manual/cl-format.html但您应该解析符号名称并且kcachegrind需要打开名称压缩)更简单的方法(对于平面)是使用来自binutils的一些awk
/ perl
/ python
脚本和addr2line
工具(您需要支持目标架构的addr2line) 。此工具将为您提供地址中的函数名称(如果您正确地将PC示例映射到elf二进制文件的虚拟地址),并且您的脚本应该为每个函数求和样本,然后进行排序。在小脚本中处理callgraph更难。
gpreftools的pprof
只是可以为你运行addr2line的脚本(你仍然需要addr2line的正确变体)。它能够为函数和排序求和样本,甚至可以调用objdump
来进行带注释的反汇编。
两种格式都可用于平面轮廓,但它们支持某种程度的调用图。 pprof允许您在每个事件中保存完整的回溯;而callgrind.out格式只存储对caller-callee(cfn),而kcachegrind可能错误地猜测pathes到热代码。