2016-03-15 22 views
4

我對使用英特爾引腳工具進行代碼檢測相對比較陌生,我試圖研究分支預測。具體來說,我想列出所有分支機構,分支目標以及它們是否被採納。我知道SimpleExamples中有pintools用於生成內存地址跟蹤,例如「pinatrace.cpp」工具,但我沒有看到任何符合我對列表分支的需求。如何使用Intel Pin工具生成分支機構列表?

在我可以使用的例子中是否存在一個現有的pintool,或者我是否需要編寫一個新的pintool?

我在Linux計算機上使用pin-2.14。

謝謝!

回答

2

我不確定是否有這樣做的示例pintool,但這可以做得相對簡單。

如果我理解正確的話,你需要3樣東西:

  1. 所有條件分支的地址

  2. 目標

  3. 採取/不採取決定

1/2。這可以通過使用指令級儀器來完成。使用INS_AddInstrumentFunction(Instruction, 0)爲了允許在每次執行新指令時調用功能Instruction(INS ins, VOID *v)。然後在Instruction()函數中,可以使用if(INS_IsBranch(ins) && INS_HasFallThrough(ins))表達式來確定當前指令是否爲條件分支。如果是,則將其地址INS_Address(ins)及其目標INS_DirectBranchOrCallTargetAddress(ins)一起存儲。也許你可以打印它的反彙編以用於調試目的INS_Disassemble(ins)

3.爲了打印出決定,您必須在每個條件分支前插入一個分析例程。使用上面的指令功能,if(INS_IsBranch(ins) && INS_HasFallThrough(ins))內,使用此API調用:

INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)<YOUR FUNCTION NAME>, IARG_INST_PTR, IARG_BRANCH_TAKEN, IARG_END)

利用這一點,你可以創建將運行的每個動態執行的條件分支時間的分析程序。從那裏使用IARG_BRANCH_TAKEN參數,你可以做一個簡單的檢查來確定分支是否被採用。將決定存儲在地圖或類似地圖的地方,以便以後可以打印出來。警告:不要在分析例程中打印任何內容(打印出動態的指令跟蹤從不是一個好主意)。還要注意,一個條件分支可能會在不同的已採取/未採取的決策中運行多次,因此您可能需要跟蹤多個決策。

希望這會有所幫助。

CHEERS,

丹尼

+0

感謝@dannykim。我最終修改了'ToolUnitTests/branch_target_addr.cpp' Pin工具以滿足我的需求,但最終結果與您描述的方法非常相似。 –