我想在指令级别对我的C代码进行统计分析.我需要知道我正在执行多少次加法,乘法,除法等.
这不是您通常的磨码分析要求.我是算法开发人员,我想估算将代码转换为硬件实现的成本.为此,我被问到运行时的指令调用故障(解析编译的程序集是不够的,因为它不考虑代码中的循环).
环顾四周后,似乎VMware可能提供了一个可能的解决方案,但我仍然找不到能够跟踪我的进程的指令调用流的特定功能.
你知道任何能够实现这一目标的分析工具吗?
(编辑:根据当前"技巧"下面的第一个答案似乎是使用Atom处理器.但我希望一些gdb专家可以回答,如果这是一个基本的限制,或者是否在路线图上增加了对其他处理器的支持?)
反向执行似乎在我的环境中工作:我可以反向继续,查看合理的记录日志,并在其中移动:
(gdb) start
...Temporary breakpoint 5 at 0x8048460: file bang.cpp, line 13.
Starting program: /home/thomasg/temp/./bang
Temporary breakpoint 5, main () at bang.cpp:13
13 f(1000);
(gdb) record
(gdb) continue
Continuing.
Breakpoint 3, f (d=900) at bang.cpp:5
5 if(d) {
(gdb) info record
Active record target: record-full
Record mode:
Lowest recorded instruction number is 1.
Highest recorded instruction number is 1005.
Log contains 1005 instructions.
Max logged instructions is 200000.
(gdb) reverse-continue
Continuing.
Breakpoint 3, f (d=901) at bang.cpp:5
5 if(d) …Run Code Online (Sandbox Code Playgroud) 我写了这个pintool:
#include "pin.H"
#include <iostream>
#include <fstream>
VOID Instruction(INS ins, VOID *v)
{
cout << INS_Disassemble(ins) << endl;
}
VOID Fini(INT32 code, VOID *v)
{
cout << "Fin" << endl;
}
int main(int argc, char *argv[])
{
if( PIN_Init(argc,argv) )
{
cout << "Erreur PIN_Init" << endl;
return 0;
}
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在打印所有说明。我现在要做的是显示指令地址(EIP)
我怎样才能做到这一点 ?
谢谢