在写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);
}