我對使用英特爾引腳工具進行代碼檢測相對比較陌生,我試圖研究分支預測。具體來說,我想列出所有分支機構,分支目標以及它們是否被採納。我知道SimpleExamples中有pintools用於生成內存地址跟蹤,例如「pinatrace.cpp」工具,但我沒有看到任何符合我對列表分支的需求。如何使用Intel Pin工具生成分支機構列表?
在我可以使用的例子中是否存在一個現有的pintool,或者我是否需要編寫一個新的pintool?
我在Linux計算機上使用pin-2.14。
謝謝!
我對使用英特爾引腳工具進行代碼檢測相對比較陌生,我試圖研究分支預測。具體來說,我想列出所有分支機構,分支目標以及它們是否被採納。我知道SimpleExamples中有pintools用於生成內存地址跟蹤,例如「pinatrace.cpp」工具,但我沒有看到任何符合我對列表分支的需求。如何使用Intel Pin工具生成分支機構列表?
在我可以使用的例子中是否存在一個現有的pintool,或者我是否需要編寫一個新的pintool?
我在Linux計算機上使用pin-2.14。
謝謝!
我不確定是否有這樣做的示例pintool,但這可以做得相對簡單。
如果我理解正確的話,你需要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,
丹尼
感謝@dannykim。我最終修改了'ToolUnitTests/branch_target_addr.cpp' Pin工具以滿足我的需求,但最終結果與您描述的方法非常相似。 –