是否可以使用valgrind获取有关程序运行的指令配置文件的信息。通过指令简档,我指的是分解为每种类型指令的指令数。例如:'n1'MOV,'n2'CALL等。如果没有,还有哪些其他工具可以做到?
答案 0 :(得分:2)
我认为,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脚本解析call {callgrind.out.$pid
的输出(此文件是基于文本的 - {{3} } - 根据" 3.1.6。子位置压缩")将有十六进制地址和偏移量。您将获得每个地址的机器指令和执行计数的地址,因此脚本可以将计数与反汇编结合起来。
(其他方法是切换到一些不精确的探查器,如perf
或oprofile
,以获得与文本相同的带注释的反汇编,并通过自定义脚本对其进行解析。结果与valgrind不完全相同,但是使用文本形式的命令更容易获得计数)
PS:我认为编写脚本比攻击valgrind的插件(callgrind
)更容易,为每种指令类型添加了几个计数器。这仍然是可能的,但是比普通的callgrind更加困难并且会使仪表程序的速度降低几倍。