當一個大型程序中存在着一個非常隱蔽的錯誤(所謂隱蔽,指的是我從運行過程中發現程序不正常,但是即使檢查源代碼,也很難發現何處存在錯誤),於是乎,我們在運行過程中添加一些輸出語句,把中間結果或者程序狀態輸出出來,根據大量的結果來推測程序究竟出錯在何處。這種情況是絕非程序斷點能夠搞定的,因爲有時候你斷無可斷(特別是對於DLL程序的調試)。由於我們輸出的debug信息只能由Dbmon.exe(或Dbgview.exe)來顯示。所以,即使程序發佈之後,也無須去掉這些調試點,這樣對以後排錯也很有利。
OutputDebugString 是微軟提供給我們用於輸出調試信息的API函數,但是它只能直接輸出的是字符串,而像GetLastError()返回數字型的的信息,需要經過類型轉換(使用itoa將整型轉換爲字符數組)才能輸出,比較麻煩。我們需要一種類似於printf函數的信息輸出函數,它可以支持輸出任何類型,任何個數的數據,例如:
printf("地址: %p,字符串: %s,錯誤號:%d\n ",p1,szStr,GetLastError());
下面的一個自定義的調試信息輸出函數(MyDebug),它實現了我們期望的功能,經過我在項目中的實際使用,發現效果很不錯。
#include <stdarg.h>
#include <stdio.h>
#include <windows.h>
void MyDebug(const char * sz, ...)
{
char szData[512]={0};
va_list args;
va_start(args, sz);
_vsnprintf(szData, sizeof(szData) - 1, sz, args);
va_end(args);
OutputDebugString(szData);
}
使用起來很簡單,和printf函數調用格式基本一樣,例如:
MyDebug("地址: %p,字符串: %s,錯誤號:%d\n ",p1,szStr,GetLastError());