2014-02-07 43 views
10

我需要根據x86機器指令計數(以便稍後可以在某個仿真器/模擬器中運行)估算程序中某個熱點的確切起始位置。有沒有辦法使用gdb來統計正在執行的機器指令的數量?當然還有其他的選擇,我可以使用仿真/二進制儀器工具(如Pin),並在計算指令時跟蹤運行,但這需要在我工作的每個平臺上安裝此工具 - 並非總是可行。我需要幾乎所有Linux機器上都有的工具。使用gdb計算機器指令

對於gdb,我猜測它也可以運行stepi X作爲某種粗粒度搜索,直到我們到達斷點,然後重複降低分辨率,但這會非常慢。有沒有另一種方法來做到這一點?

+0

GDB完全不適合此目的。使用類似[PAPI](http://icl.cs.utk.edu/papi/)的內容來準確衡量應用程序的執行情況。無論如何,你應該在任何地方都有編輯工具。 –

+0

@mfukar謝謝,但我不確定它像GDB一樣隨處可用。我也不會說GDB是完全不合適的,它似乎是一個非常簡單的功能,因爲它已經知道如何在機器分辨率下進行操作 - 所需的只是跟蹤指令數量。 – Leeor

+0

'在調試器中執行程序會改變對性能(緩存狀態,TLB未命中等)可能至關重要的程序狀態。在調試器中運行程序時得到的結果僅適用於該情況。 –

回答

13

試試這個:

set pagination off 
set $count=0 
while ($pc != 0xyourstoppingaddress) 
stepi 
set $count=1+$count 
end 
print $count 

然後去拿一杯咖啡。或者是很長的午餐。

+1

工作正常,除了我需要在那裏添加一個'start'。我爲我長時間的午餐休息,謝謝! :) – Leeor

+0

並完成(運行,而不是午餐)。 ~1.2k insts/sec - 慢,但作爲後備選項不會太差。 – Leeor

3

這實際上只是Mark解決方案的可用性的輕微改進。

我們可以定義一個函數do_count

define do_count 
set $count=0 
while ($pc != $arg0) 
stepi 
set $count=$count+1 
end 
print $count 
end 

,然後該功能可重複使用的一遍又一遍的計算步數:

set pagination off 
do_count 0xaddress1 
do_count 0xaddress2 

一個甚至可以把這個定義成.gdbinit(在Linux上,在Windows上它應該被稱爲gdb.ini)在home文件夾中,所以它在gdb啓動後自動變爲可用(使用show user來查看該函數是否被加載)。