DebugView输出调试信息[通俗易懂]

(25) 2023-03-27 18:44

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说DebugView输出调试信息[通俗易懂],希望能够帮助你!!!。
DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第1张

在写windows程序时,需要输出一些调试信息,这里介绍一种极其方便的方法。即使用OutputDebugString 在Debug模式下输出调试信息,在Release模式下不输出。

我们可以在VS的集成平台上输出调试信息,也可以使用DebugView来查看调试信息。

1.)DebugView图文教程

1、DbgView界面和监控方法
DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第2张

打开软件后,顶部工具栏中选择监控主机。先看连接本地机调试,点击“Connect Local”即可。

在这个工具栏上,主要看几个图标DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第3张

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第4张此按钮,表示是否开启捕获服务

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第5张此按钮,表示是否捕获系统内核的Debug信息

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第6张此按钮,表示是否捕获一般Win32应用,也就相当于我们的应用的Debug信息

 

注意:只有调用了WinDebug中方法的地方的输出Debug信息才能被DebugView捕获。

 

再来看看捕获的应用信息:将打开DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第7张DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第8张两个按钮的叉叉去掉,就会看到DebugView可能输出一些信息。如下图: 

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第9张

 这些都是系统中的应用调用WinAPI所输出的Debug信息。但是只有红色部分是我们的Demo所输出的信息。

此时我们可以新建过滤器,只查看我们自己想看到的信息DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第10张打开后我们看到下图

 DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第11张

在Include和Exclude,分别表示Debug Print的内容“包含”“不包含”的字符串。

例如在include中输入:GTA

 DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第12张

点击OK后

 DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第13张

DebugView就会只显示GTA开头的Debug信息,因此在写程序时,为了监控方便,我们可以将Debug信息分类,以不同的前缀或标志为约束,统一Debug输出格式,方便以后排除和捕获系统异常等情况。

Exclude与之相反,这里不介绍了。

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第14张另外说说,这个按钮表面显示的记录条数。

  

2、远程捕获

可以在本机调试捕获服务器上的Debug信息。

在服务器上新建dbgView.exe程序的快捷方式

 DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第15张

在快捷方式的“目标“后键入:空格+/c字符。然后确定。

DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第16张

再运行快捷方式,服务器就会等待连接。

此时客户端打开自己的dbgview.exe

 DebugView输出调试信息[通俗易懂]_https://bianchenghao6.com/blog__第17张

点击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); 
	
}


 

上一篇

已是最后文章

下一篇

已是最新文章

发表回复