在寫windows程序時,需要輸出一些調試信息,這里介紹一種極其方便的方法。即使用OutputDebugString 在Debug模式下輸出調試信息,在Release模式下不輸出。
我們可以在VS的集成平臺上輸出調試信息,也可以使用DebugView來查看調試信息。
1.)DebugView圖文教程
1、DbgView界面和監控方法
打開軟件后,頂部工具欄中選擇監控主機。先看連接本地機調試,點擊“Connect Local”即可。
在這個工具欄上,主要看幾個圖標
此按鈕,表示是否開啟捕獲服務
此按鈕,表示是否捕獲系統內核的Debug信息
此按鈕,表示是否捕獲一般Win32應用,也就相當于我們的應用的Debug信息
?
注意:只有調用了WinDebug中方法的地方的輸出Debug信息才能被DebugView捕獲。
?
再來看看捕獲的應用信息:將打開兩個按鈕的叉叉去掉,就會看到DebugView可能輸出一些信息。如下圖:?
?這些都是系統中的應用調用WinAPI所輸出的Debug信息。但是只有紅色部分是我們的Demo所輸出的信息。
此時我們可以新建過濾器,只查看我們自己想看到的信息打開后我們看到下圖
?
在Include和Exclude,分別表示Debug Print的內容“包含”“不包含”的字符串。
例如在include中輸入:GTA
?
點擊OK后
?
DebugView就會只顯示GTA開頭的Debug信息,因此在寫程序時,為了監控方便,我們可以將Debug信息分類,以不同的前綴或標志為約束,統一Debug輸出格式,方便以后排除和捕獲系統異常等情況。
Exclude與之相反,這里不介紹了。
另外說說,這個按鈕表面顯示的記錄條數。
??
2、遠程捕獲
可以在本機調試捕獲服務器上的Debug信息。
在服務器上新建dbgView.exe程序的快捷方式
?
在快捷方式的“目標“后鍵入:空格+/c字符。然后確定。
再運行快捷方式,服務器就會等待連接。
此時客戶端打開自己的dbgview.exe
?
點擊connect后,輸入服務器的IP地址,便連上服務器了。這樣,用戶可以在本地直接捕獲服務器上的Debug信息了。
主要功能就是這些。另外,如果要在運行時應用不輸出debug信息,可以將web.config或app.config中的
<system.web>
?????????????????? <compilation debug="true" targetFramework="4.0"/>
設置為false,然后在調用WinDebug的地方就不會再輸出Debug信息了
2.) 在程序中輸出調試信息
參考:
- ?http://www.cnblogs.com/mushan/p/3351321.html
- ?http://www.cnblogs.com/ziwuge/archive/2011/10/31/2230326.html
- http://blog.csdn.net/tanaya/article/details/5774671
要注意OutputDebugString 的格式,注意ASCII和Unicode不一樣。
WINBASEAPI
VOID
WINAPI
OutputDebugStringA(
__in_opt LPCSTR lpOutputString
);
WINBASEAPI
VOID
WINAPI
OutputDebugStringW(
__in_opt LPCWSTR lpOutputString
);
#ifdef UNICODE
#define OutputDebugString OutputDebugStringW
#else
#define OutputDebugString OutputDebugStringA
#endif // !UNICODE
以下是我截取上面博客中的程序,可以直接使用。
debugPrint.h
//木杉的博客 http://www.cnblogs.com/mushan
//2012年6月10日
#ifndef _DEBUGPRINTF_H_
#define _DEBUGPRINTF_H_
#include<Windows.h>
#include <tchar.h>
//用于輸出信息到編譯器輸出窗口的宏定義
//使用win API,DEBUG版本會執行,RELEASE版本則不會
//還可以使用DebugView,WinDbg等工具查看輸出
#ifdef _DEBUG
#define DP0(fmt) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt));OutputDebugString(sOut);}
#define DP1(fmt,var) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var);OutputDebugString(sOut);}
#define DP2(fmt,var1,var2) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2);OutputDebugString(sOut);}
#define DP3(fmt,var1,var2,var3) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2,var3);OutputDebugString(sOut);}
//格式化輸出調試信息
void OutputDebugPrintf(const char * strOutputString,...)
{
char strBuffer[4096]={0};
va_list vlArgs;
va_start(vlArgs,strOutputString);
_vsnprintf(strBuffer,sizeof(strBuffer)-1,strOutputString,vlArgs);
//vsprintf(strBuffer,strOutputString,vlArgs);
va_end(vlArgs);
//ASCII
OutputDebugStringA(strBuffer);
}
#endif
#ifndef _DEBUG
#define DP0(fmt) ;
#define DP1(fmt, var) ;
#define DP2(fmt,var1,var2) ;
#define DP3(fmt,var1,var2,var3) ;
void OutputDebugPrintf(const char * strOutputString,...){}
#endif
#endif
main.cpp //木杉的博客 http://www.cnblogs.com/mushan
//2012年6月10日
#include<stdio.h>
#include"debugPrint.h"
void main()
{
OutputDebugPrintf("DEBUG_INFO | %d %s",600019,"北雁\n");
for(int i=0;i<10;i++)
{
printf("hello!\n");
DP0("這是調試信息!\n");
DP1("這是調試信息%d\n",i);
DP2("這是調試信息%d--%d\n",i,i+1);
DP3("這是調試信息%d--%d--%d\n",i,i+1,i+2);
}
getc(stdin);
}