2017-10-06 35 views
2

我正在使用英特爾PIN工具對C程序的彙編指令進行一些分析。我有一個簡單的C程序打印出「Hello World」,我編譯並生成了一個可執行文件。我從GDB生成的彙編指令跟蹤喜歡這個 -跟蹤英特爾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. 

我跑了pintool,我給了可執行文件的輸入,而且我現在乾的指令跟蹤和打印的指令數。我希望跟蹤來自我的C程序的指令,可能會得到機器操作碼並做一些分析。我使用的是C++ PIN工具當我跑我的Hello World程序用這個工具來算的指示中

#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; 
} 

數,我得到ICOUNT = 81563.據我所知,PIN添加自己的指令進行分析,但我不明白它是如何增加如此多的指令,而我的C程序中沒有超過10條指令。還有一種方法可以識別來自我的代碼和PIN生成的彙編指令。我似乎無法區分由PIN生成的指令和來自我的程序的指令。請幫忙!

+1

我對PIN不熟悉,但大概也是在計算C庫中的指令。 – Jester

+0

嘗試製作一個靜態可執行文件,它直接進行一個'exit'系統調用。 (例如從我的[mov消除microbenchmark]取出循環(https://stackoverflow.com/questions/44169342/can-x86s-mov-really-be-free-why-cant-i-reproduce-this-at-所有/ 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 -32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649關於如何組裝+將NASM源鏈接到靜態可執行文件(無libc)。 –