インテルPINツールを使用して、Cプログラムのアセンブリ命令を分析しています。私はコンパイルして実行可能ファイルを生成した "Hello World"を出力するシンプルなCプログラムを持っています。私は、入力として実行可能ファイルを与えたpintoolを走った、と私は命令トレースを行うと、命令の数を印刷していますthis-インテルPINのネイティブ命令のトラッキング
Dump of assembler code for function main:
0x0000000000400526 <+0>: push %rbp
0x0000000000400527 <+1>: mov %rsp,%rbp
=> 0x000000000040052a <+4>: mov $0x4005c4,%edi
0x000000000040052f <+9>: mov $0x0,%eax
0x0000000000400534 <+14>: callq 0x400400 <[email protected]>
0x0000000000400539 <+19>: mov $0x0,%eax
0x000000000040053e <+24>: pop %rbp
0x000000000040053f <+25>: retq
End of assembler dump.
のようなGDBから生成されたアセンブリ命令トレースを持っています。私は私のCプログラムの命令をトレースし、マシンのオペコードを取得して何らかの分析をしたいと考えています。私はこのツールで私のhello worldプログラムを実行するとinstructions-
#include "pin.H"
#include <iostream>
#include <stdio.h>
UINT64 icount = 0;
using namespace std;
//====================================================================
// Analysis Routines
//====================================================================
void docount(THREADID tid) {
icount++;
}
//====================================================================
// Instrumentation Routines
//====================================================================
VOID Instruction(INS ins, void *v) {
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_THREAD_ID, IARG_END);
}
VOID Fini(INT32 code, VOID *v) {
printf("count = %ld\n",(long)icount);
}
INT32 Usage() {
PIN_ERROR("This Pintool failed\n"
+ KNOB_BASE::StringKnobSummary() + "\n");
return -1;
}
int main(int argc, char *argv[]) {
if (PIN_Init(argc, argv)) return Usage();
PIN_InitSymbols();
PIN_AddInternalExceptionHandler(ExceptionHandler,NULL);
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
PIN_StartProgram();
return 0;
}
の数をカウントするためにC++ PINツールを使用しています、私はPINを分析するために、独自の指示を追加することを理解し81563. = ICOUNT得るが、私はCプログラムで10以上の命令を持っていないが、どのように多くの命令を追加するのか分からない。また、自分のコードとPINによって生成されたアセンブリ命令を識別する方法もあります。私は、PINによって生成された命令と、自分のプログラムから生成された命令とを区別する方法がないように思えます。助けてください!
私はPINに精通していませんが、おそらくCライブラリの指示もカウントしています。 – Jester
'exit'システムコールを直接作成する静的実行可能ファイルを作成してみてください。 (例えば、私の[mov除去マイクロベンチマーク]からループを取り出す(https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at- all/44193770#44193770))。 –
@PeterCordes私のCプログラムの内容は何でも、icountは常に80kを超えています。機械命令とPINによって生成された命令とを区別する方法があるかどうかはわかりません。 –