程式扎記: [ Windows DDP ] 查看除錯訊息

標籤

2010年12月23日 星期四

[ Windows DDP ] 查看除錯訊息


前言 :
編寫驅動程式的程式員, 經常遇到一個頭痛的問題, 那就是除錯. 因為驅動程式都是執行在 Kernel 模式下, 很難像一般 Win32 程式一樣除錯. 一般來說, 驅動程式的除錯主要有兩個途徑. 其一是在關鍵的地方列印出除錯訊息, 也就是俗稱的 log. 其二是呼叫內核除錯工具.諸如 Softice 或者 WinDbg 等, 進行內核除錯. 這裡將介紹查看除錯資訊的方法. 原始程式碼的內核除錯將在更後面章節陸續進行介紹.

列印除錯語句 : 
查看以前的 HelloWDM 和 HelloDDK 的程式碼, 裡面除了列印除錯資訊都是呼叫了 kdPrint. 其實這不是一個函式, 而是一個巨集. 在 Checked 版本中, 它將參數傳給內核函式DbgPrint. 此函式將會將除錯資訊記錄下來. 而在 Free 版本中, KdPrint 則什麼也不做.
在驅動程式編寫中, 應該盡量用 KdPrint 而不用 DbgPrint. 這樣就能在Checked 版本中查看除錯資訊, 而在真正發佈 Free 版本時後, 將除錯資訊隱蔽起來. KdPrint 的功能十分類似於 MFC 提供給程式員的 TRACE 巨集. KdPrint 的語法十分類似 printf. 但由於是巨集, 所以使用時須要兩重括弧. 下面是幾種常用用法 :
(1) 直接列印字串
  1. KdPrint(("Enter HelloWDMAddDevice\n"));  
(2) 列印字串
  1. char *name = "Hello";  
  2. KdPrint(("%s\n", name));  
(3) 列印 UNICODE 字元或寬字元.
  1. UNICODE_STRING devName;  
  2. // 處理 devName...  
  3. KdPrint(("$S\n", devName.Buffer)); // 注意是大寫的 S  
  4. KdPrint(("%ws\n", devName.Buffer)) ;  // 或是 ws  
(4) 列印數字
  1. Int number = 100;  
  2. KdPrint(("%d\n", number));  
(5) 列印 16進位數字
  1. Int number=100;  
  2. KdPrint(("%X\n", number));  

查看除錯語句 :
很多除錯工具都可以查看除錯資訊. 其中有 WinDbg, 還有 DriverMonitor. 但在這裡向你介紹另一個工具 DbgView. 這個軟體是免費的, 可以很容易在Google 搜尋找到.
DbgView 可以同時監聽內核和 Win32 上層應用程式發送的除錯資訊. 如果接收的資訊太多, 還可以根據自己需要濾掉無用的除錯資訊. 使用的話請先載入 HelloWDM 或是 HelloDDK 程式, 這時後驅動裡除錯資訊就會一行行地被印到 DbgView 上, 如下圖所示 :
This message was edited 5 times. Last update was at 15/12/2010 14:53:51

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!