背景
Windows OS的driver執行過程中所產生的log其實很難取得,取得後也必須要有對應的symbol(*.pdb)才能解析內容。本篇將介紹使用微軟所提供的三個工具程式(tracelog.exe、tracepdb.exe、tracefmt.exe)以NXP的NFC driver為例子,一步步示範如何取得並解析log。
準備pdb檔
.pdb檔案會隨著編譯driver時一併產生。一般我們正常安裝driver僅需要.inf、.sys、.cat這三種檔案(參考:How to Submit DUA),而.pdb則是為了debug而產生的檔案。各種裝置廠商通常只會提供必要的driver檔案而不會附上.pdb給一般使用者,只有負責幫忙debug的系統整合公司才有機會取得.pdb檔。本篇例子中,假設讀者能取得NFC大廠NXP所提供的.pdb檔,可能會拿到好幾支driver的.pdb檔。
找出所需的GUID
執行微軟所提供的tracelog.exe來取得log時,必須告訴工具你所關心的log是由哪些driver所產生的。因為同一時間會有幾十支driver與應用程式正在產生log,如果不指定對象的話,所取得的log將失去易讀性,因此必須指定你所關心的log是哪些。其方法是告知driver的GUID讓工具知道,但要如何知道那些.pdb檔案的GUID為何?微軟的另個工具tracepdb.exe可以給你答案。首先先將tracepdb.exe與所關心的.pdb檔案放在同一目錄下,然後可在視窗下直接雙點擊tracepdb.exe或是透過終端機以指令方式不帶任何參數來執行tracepdb.exe。接著可以看到一堆奇怪英文數字組合檔名的檔案*.tmf以及*.mof檔跑出來。
使用記事本開啟所有產生的*.mof檔後可以找到GUID。本例中,可以從NxpNfpProvider.mof看到guid("{93bfc19b-a967-4339-a3e6-3a4cc30681d1}"),而nfcgpiomanager.mof裡面則可找到guid("{aa8d3484-2bf3-4417-bf11-02fafe310148}")。裡面那串英文數字夾雜的一長串就是GUID。
使用記事本開啟所有產生的*.mof檔後可以找到GUID。本例中,可以從NxpNfpProvider.mof看到guid("{93bfc19b-a967-4339-a3e6-3a4cc30681d1}"),而nfcgpiomanager.mof裡面則可找到guid("{aa8d3484-2bf3-4417-bf11-02fafe310148}")。裡面那串英文數字夾雜的一長串就是GUID。
開始抓log
再來正式開始抓log,此步驟需要使用微軟提供的tracelog.exe,在終端機下,透過給予參數下指令的方式執行:
OOOO是自己取的名稱,只是為了讓系統知道你為這個紀錄log的程序叫啥名稱,方便之後停止抓log時可以指定名稱。ooo.etl則是產生的log檔要叫做什麼名字。這邊最重要的是xxx.ctl,前一步驟所收集的GUID資訊就是要用記事本填入這支檔案。本例中所找到的兩組GUID填入此xxx.ctl之後,內容看起來如下:
一旦執行上述指令後,就可以開始複製問題。問題複製完畢後必須停止錄製log的程序,只要在終端機下執行:
tracelog -start OOOO -guid xxx.ctl -f ooo.etl -flag 0xffff -level 0xFFFF -UsePerfCounter
OOOO是自己取的名稱,只是為了讓系統知道你為這個紀錄log的程序叫啥名稱,方便之後停止抓log時可以指定名稱。ooo.etl則是產生的log檔要叫做什麼名字。這邊最重要的是xxx.ctl,前一步驟所收集的GUID資訊就是要用記事本填入這支檔案。本例中所找到的兩組GUID填入此xxx.ctl之後,內容看起來如下:
一旦執行上述指令後,就可以開始複製問題。問題複製完畢後必須停止錄製log的程序,只要在終端機下執行:
tracelog -stop OOOO
接著就會產生ooo.etl。
解析log
上述步驟所取得的ooo.etl到現在還是無法正常讀取,最後一個步驟就是將ooo.etl轉換成可讀的log。此時需要前面產生的*.tmf與*.mof檔案的幫忙。將ooo.etl與微軟工具tracefmt.exe和那些*.tmf與*.mof放在同一目錄下,接著透過終端機輸入下述指令:
tracefmt ooo.etl –o ooo.txt
然後ooo.txt檔案就會紀錄著從執行tracelog -start到tracelog -stop這中間所抓取的log,ooo.txt可能會長的像
沒有留言:
張貼留言