跟踪/分析说明
我想在指令级别对我的C代码进行统计分析。 我需要知道我正在执行多少次加法,乘法,除法等。
这不是您通常的磨码分析要求。 我是算法开发人员,我想估算将代码转换为硬件实现的成本。 为此,我在运行时被问到指令调用故障(解析编译的程序集是不够的,因为它不考虑代码中的循环)。
环顾四周后,似乎VMware可能提供了一个可能的解决方案,但我仍然找不到能够跟踪我的进程的指令调用流的特定function。
你知道任何能够实现这一目标的分析工具吗?
我最终使用了一个微不足道但又有效的解决方案。
- 配置GDB通过调用显示下一条指令的反汇编(每次停止):
display/i $pc
-
配置了一个简单的gdb脚本,该脚本在我需要分析的函数中断,并按指令继续执行步骤:
设置$ i = 0 打破主力 跑 而($ i <100000) SI 设置$ i = $ i + 1 结束 放弃
-
使用我的脚本将输出转储到日志文件中执行gdb:
gdb -x script a.out > log.txt
-
分析日志以计算特定的指令调用。
原油,但它的工作原理......
您可以使用pin-instat作为PIN工具。 它有点过于杀戮,因为它记录的信息多于指令数。 它仍然应该比你的gdb方法更有效。
免责声明:我是pin-instat的作者。
valgrind工具cachegrind可用于获取已编译程序集中每行的执行计数(第一列中的Ir
值)。
Linux工具perf
将为您提供大量的分析信息; 具体而言, perf annotate
将为您提供每指令相对计数。
可以使用
perf annotate
向下钻取到指令级别。 为此,您需要使用要perf annotate
的命令的名称来调用perf annotate
annotate。 所有带样本的函数都将被反汇编,每条指令都会报告相关的样本百分比:perf记录./noploop 5 perf annotate -d ./noploop ------------------------------------------------ 百分比| noploop.noggdb的源代码和反汇编 ------------------------------------------------ : : : :反汇编.text: : :08048484: 0.00:8048484:55推%ebp 0.00:8048485:89 e5 mov%esp,%ebp [...] 0.00:8048530:eb 0b jmp 804853d 15.08:8048532:8b 44 24 2c mov 0x2c(%esp),%eax 0.00:8048536:83 c0 01添加$ 0x1,%eax 14.52:8048539:89 44 24 2c mov%eax,0x2c(%esp) 14.27:804853d:8b 44 24 2c mov 0x2c(%esp),%eax 56.13:8048541:3d ff e0 f5 05 cmp $ 0x5f5e0ff,%eax 0.00:8048546:76 ea jbe 8048532 [...]