手機網(wǎng)站底部代碼北京seo網(wǎng)站管理
Intel處理器跟蹤PT技術(shù)是記錄程序執(zhí)行過程的技術(shù),它把記錄信息編碼報文存到高壓縮率的二進制文件中。該二進制文件結(jié)合每條指令的時間戳重建執(zhí)行流。PT技術(shù)覆蓋度大,開銷小,有關(guān)開銷的信息詳見,主要用于性能問題的事后分析和根因定位。
6.4.1 工作流
類似于采樣技術(shù),PT技術(shù)不需要修改任何源代碼。只要在支持PT技術(shù)的工具下運行目錄程序,然后抓取跟蹤文件即可,一旦啟動PT且基準測試程序開始運行,分析工具就開始把跟蹤報文記錄到DRAM中。
類似于LBR, Intel PT技術(shù)通過記錄分支來實現(xiàn)。在程序運行時,只要CPU遇到分支跳轉(zhuǎn)指令,PT將會記錄這個分支跳轉(zhuǎn)指令的輸出。對于簡單的分支跳轉(zhuǎn)指令,CPU會用一位來記錄它是被選中還是未被選中NT。對于間接調(diào)用。PT會記錄目標地址,注意,非條件分支跳轉(zhuǎn)指令不會被記錄,因為我們知道它的目標地址。
圖37中展示了小型指令序列的編碼。類似PUSH,MOV, ADD和CMP這樣的指令會被忽略,因為他們不會改變控制流。然而,指令JE可能會跳轉(zhuǎn)到label, 所以它的結(jié)果需要被記錄下來。
在分析時,我們將應(yīng)用程序的二進制文件和采集的PT跟蹤信息匯總到一起,軟件解碼器需要應(yīng)用程序的二進制文件來重建程序的執(zhí)行流,從入口點開始,然后將采集的跟蹤信息作為查詢參考來決定控制流。圖38中展示了一個解析Intel PT文件的例子。假設(shè)Push指令時應(yīng)用程序二進制文件的入口點,然后Push mos add和CMP保持原來的樣子被重建,這一步無需查詢被解析的跟蹤信息。接著,軟件解碼器開始處理JE指令,分支跳轉(zhuǎn)指令,因此我們需要查詢分支跳轉(zhuǎn)指令的輸出。根據(jù)圖38中的跟蹤文件,JE的條件被選中T,所以跳過MOV指令調(diào)用了CALL指令。
我們接著繼續(xù)分析,CALL 也是一個可以改變控制流的指令,因此我們需要在解析后的跟蹤信息中查找目標地址,它是0x407e1d8。高亮的指令是在程序運行過程中被執(zhí)行過的。注意,這就是程序運行的精確重建,并且不會跳過任何指令。接下來,我們可以通過調(diào)試信息把匯編指令映射回源代碼,獲得源代碼逐行的日志。
運行時
指令 編碼
push
mov
cmp
je.label
mov
label
call 虛函數(shù)
圖37 Intel處理器跟蹤PT編碼
6.4.2 時間報文
Intel PT工具不僅可以跟蹤執(zhí)行流,還可以記錄時間信息。作為保存跳轉(zhuǎn)目標地址的補充,PT工具還可以產(chǎn)生時間報文。圖39中提供了一個時間報文如何被用來恢復(fù)指令時間戳的可視化展示示例。和前面的例子一樣,我們首先看到JNE沒有被選中,所以需要把它和它之上的所有指令的時間戳都更新為0ns, 然后,我們看到一個2ns的時間更新且JE指令被選中,所以把它和它之上的所有指令的時間戳都更新2ns,再往后是一條間接調(diào)用指令,但是沒有與之相關(guān)的時間報文,所以我們不需要更新時間戳。然后,我們看到一個100ns的時間更新并且指令JB沒有被選中,所以其上的所有指令時間戳都要更新102ns。
在圖39中,指令數(shù)據(jù)是非常精確的,但是時間信息沒有那么精確,顯然,指令CALL TEST和JB不會同時發(fā)生,但是我們沒有有關(guān)它們的更精確的時間信息。有了時間戳,我們可以吧程序和系統(tǒng)中的其他事件的時間間隔進行對齊,并且很容易與掛鐘時間進行比較,在某些實現(xiàn)中,跟蹤時許可以通過時鐘周期精確模式進一步改進,其中硬件記錄正常數(shù)據(jù)報文之間的時鐘周期計數(shù)。
分析時
指令
mov
jnz
add
cmp
je.label
mov
.label
call
test
jb
6.4.3 采集和解析跟蹤文件
用Linux perf工具可以方便采集IntelPT的跟蹤文件
perf record -e intel_pt/cycle/u ./a.out
6.4.4 用法
可能使用PT技術(shù)處理的幾個例子
1 分析性能問題 因為PT會采集所有的指令流,所以可以分析在應(yīng)用程序無響應(yīng)的一小段時間內(nèi)發(fā)生了什么,更多詳細例子相見easyperf 博客上的文章。
2 事后調(diào)試 PT跟蹤文件可以使用傳統(tǒng)的調(diào)試工具重放,此外,PT還會提供調(diào)試棧信息,即使在棧被破壞的情況下也總是有效的。PT跟蹤文件可以在遠程機器上采集,然后再離線分析。
3 程序執(zhí)行的回溯
可以快速發(fā)現(xiàn)哪些代碼路徑從未被執(zhí)行
借助時間戳,當發(fā)生自旋鎖嘗試時,可以計算出在等待上花費了多長時間。
通過檢測待定的指令模式來檢測安全問題。