使用 Valgrind 获取指令配置文件
Posted
技术标签:
【中文标题】使用 Valgrind 获取指令配置文件【英文标题】:Getting an instruction profile using Valgrind 【发布时间】:2015-12-15 01:02:38 【问题描述】:是否可以使用 valgrind 获取有关程序运行的指令配置文件的信息。指令配置文件是指分解为每种类型指令的指令数量。例如:'n1' MOV、'n2' CALL 等。如果没有其他工具可以做到这一点?
【问题讨论】:
【参考方案1】:我认为,valgrind 没有现成的工具来完成这项任务。您可以尝试编写一些脚本来获取这些信息,或者通过 GUI 手动获取基本数据。
valgrind 中有callgrind
工具来分析程序执行情况:
valgrind --tool=callgrind [callgrind-options] ./your-program
(检查http://valgrind.org/docs/manual/cl-manual.html)
有了它,您可以获得每条指令执行计数(Ir
事件)和执行指令总数的准确数据,但不会有关于 n1 MOV、n2 CALL 等的汇总信息。
使用--dump-instr=yes
callgrind 选项将获得每条机器指令执行次数的准确数据;可以使用“汇编程序”选项卡中的kcachegrind
GUI 查看此数据。不确定callgrind_annotate
是否会解析此类文件并显示带注释的反汇编,但可以通过某些 perl/python 脚本解析 callgrind 的callgrind.out.$pid
输出(此文件是基于文本的 - http://valgrind.org/docs/manual/cl-format.html - 会有十六进制地址和偏移量根据“3.1.6. Subposition Compression”)。您将获得机器指令的地址和每个地址的执行计数,因此脚本可以将计数与反汇编结合起来。
(另一种方法是切换到一些不精确的分析器,如perf
或oprofile
以获得与文本相同的带注释的反汇编并通过自定义脚本对其进行解析。结果将与 valgrind 不完全相同,但更容易使用文本形式的命令获取计数)
PS:我认为编写脚本比破解 valgrind 的插件 (callgrind
) 更容易,为每种指令类型添加多个计数器。这仍然是可能的,但要困难得多,并且会比普通的 callgrind 减慢检测程序的速度数倍。
【讨论】:
以上是关于使用 Valgrind 获取指令配置文件的主要内容,如果未能解决你的问题,请参考以下文章