2017-10-06 6 views
2

インテル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によって生成された命令と、自分のプログラムから生成された命令とを区別する方法がないように思えます。助けてください!

+1

私はPINに精通していませんが、おそらくCライブラリの指示もカウントしています。 – Jester

+0

'exit'システムコールを直接作成する静的実行可能ファイルを作成してみてください。 (例えば、私の[mov除去マイクロベンチマーク]からループを取り出す(https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at- all/44193770#44193770))。 –

+0

@PeterCordes私のCプログラムの内容は何でも、icountは常に80kを超えています。機械命令とPINによって生成された命令とを区別する方法があるかどうかはわかりません。 –

答えて

0

あなたはあなたが測定していると思っているものを測定していません。詳細については、ここに私の答えを参照してください: What instructions 'instCount' Pin tool counts?

ピンが自身の指示をカウントないありません。大きなカウントは、main()の前後の準備の結果であり、printf()の呼び出しです。

+0

私は[提案](https://stackoverflow.com/questions/46596570/tracking-native-instructions-in-intel-pin#comment80146865_46596570)のいくつかのライブラリに起因すると思うOPは静的な実行可能ファイルを作成しようとする必要があります'_start'から' sys_exit'システムコールを作成するだけです。 OPは彼らに「同じ数の命令」があると言いますが、答えが間違っている可能性が高いことを示しています。 –

+0

私は確かにこれが当てはまると思う。私はしばらくそれをしていないが、私はそのような実行可能ファイルを作ることは少しトリッキーであることを覚えている。 – nitzanms

+1

とにかくいつでもマイクロベンチマーキングのためにそうしていないのであれば、P:https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at -all/44193770#44193770(ループを抜けて '_start:xor edi、edi' /' mov eax、231'/'syscall'を残してください)。https://stackoverflow.com/questions/36861903/assembling NASMソースを静的実行可能ファイル(libcなし)にアセンブルする方法については、-32ビットバイナリオン-64ビットシステム-gnu-toolchain/36901649を参照してください。 –