跟踪/分析说明

我想在指令级别对我的C代码进行统计分析。 我需要知道我正在执行多少次加法,乘法,除法等。

这不是您通常的磨码分析要求。 我是算法开发人员,我想估算将代码转换为硬件实现的成本。 为此,我在运行时被问到指令调用故障(解析编译的程序集是不够的,因为它不考虑代码中的循环)。

环顾四周后,似乎VMware可能提供了一个可能的解决方案,但我仍然找不到能够跟踪我的进程的指令调用流的特定function。

你知道任何能够实现这一目标的分析工具吗?

我最终使用了一个微不足道但又有效的解决方案。

  1. 配置GDB通过调用显示下一条指令的反汇编(每次停止):

display/i $pc

  1. 配置了一个简单的gdb脚本,该脚本在我需要分析的函数中断,并按指令继续执行步骤:

     设置$ i = 0
    打破主力
    跑
    而($ i <100000)
     SI
    设置$ i = $ i + 1
    结束
    放弃
    

  2. 使用我的脚本将输出转储到日志文件中执行gdb:

    gdb -x script a.out > log.txt

  3. 分析日志以计算特定的指令调用。

原油,但它的工作原理......

您可以使用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
[...]