今天我們接著介紹另一種偵錯方式,WPP軟體追蹤。
WPP 軟體追蹤類似於使用 Windows 事件記錄服務,驅動程式會在記錄檔中記錄相關資訊,而後處理器會將記錄檔中的資訊轉換成人類可讀取的格式。
在Non-Pnp driver sample中有定義trace.h
供WPP軟體追蹤使用,我們會使用到tracepdb
,tracelog
和tracefmt
這三個工具。上述三個工具在安裝WDK時就有一併安裝了,以我的編譯環境會位於C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64
內。
tracepdb
,輸入的pdb檔為Non-Pnp driver編譯完成後所產生出的nonpnp.pdb
,會產生出追蹤訊息格式(TMF)檔,提供追蹤訊息的格式設定。
racepdb.exe -f <your nonpnp drvier sample loaction>\kmdf\sys\x64\Debug\nonpnp.pdb
``
[](https://raw.githubusercontent.com/papa12804/pics/master/debug-11.png)
tracelog
,
racelog -start MyTrace -guid #71ae54db-0862-41bf-a24f-5330cec3c7f6 -flag 7 -level 0xFFFF
``
[](https://raw.githubusercontent.com/papa12804/pics/master/debug-8.png)
下我們簡單介紹傳入的參數:
`-start`,啟動追蹤會話,名稱為後方的`MyTrace`。
`-guid`為`trace.h`中所定義的GUID,如下方所示:
```c
#define WPP_CONTROL_GUIDS \
WPP_DEFINE_CONTROL_GUID( FileIoTraceGuid, \
(71ae54db,0862,41bf,a24f,5330cec3c7f6), \
WPP_DEFINE_BIT(DBG_INIT) \
WPP_DEFINE_BIT(DBG_RW) \
WPP_DEFINE_BIT(DBG_IOCTL) \
)
- 可以參考[WPP_CONTROL_GUIDS](https://learn.microsoft.com/zh-tw/previous-versions/windows/hardware/previsioning-framework/ff556186(v=vs.85))的說明。
- `FileIoTraceGuid`為**GUIDFriendlyName**,
- 這裡的GUID格式與一般常見由32個16進位數字所組成的GUID有所不同,稱為**ControlGUID**。一共有五個欄位,以逗號分隔,並使用括弧括住。
- `WPP_DEFINE_BIT`會定義**追蹤旗標**,最多可以定義 31 個追蹤旗標,由bit 0開始遞增。
-flag
-level
TraceEvents
時會傳入追蹤層級,當啟動追蹤會話時,會記錄所指定追蹤層級的追蹤訊息,而追蹤層級定義在Evntrace.h
中。下方TRACE_LEVEL_VERBOSE
即為追蹤層級。
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_INIT,
"Driver Frameworks NONPNP Legacy Driver Example");
``
tracelog
。停止tracelog
後會產生出記錄檔,由於沒有指定記錄檔位置及名稱,預設會儲存在當前目錄下並命名為LogFile.Etl
。
racelog -stop MyTrace
``
[](https://raw.githubusercontent.com/papa12804/pics/master/debug-9.png)
tracefmt
,將LogFile.Etl
轉換為人類可讀的檔案。
racefmt LogFile.Etl -p . -o nonpnp.out
``
`-p`,指定TMF檔的路徑,由`tracepdb`所產生。
`-o`,指定輸出檔案的名稱,這裡設定為`nonpnp.out`。
[](https://raw.githubusercontent.com/papa12804/pics/master/debug-10.png)
nonpnp.out
,就可以看到執行Non-PnP driver測試程式時驅動程式所丟出來的偵錯訊息。WPP軟體追蹤可記錄系統識別碼、時間戳和內建的其他資料類型,我們也可以自行定義所需要的資料類型,相當有彈性,Windows驅動程式範例中有許多範例都使用了WPP軟體追蹤來偵錯。
Tracedrv - README
Tracepdb
Tracelog
Tracefmt
TMF