MFC 打印调试 信息 OutputDebugString

MFC 打印调试 信息 OutputDebugString

F5 调试

在这里插入图片描述
在这里插入图片描述

f:\mfc_work\mfc_code_jack\data_struct_app\cstring_app\cstringtest\cstringtestdlg.cpp(198) : atlTraceGeneral - 输出调DD试信息666 
输出调DD试信息123

使用OutputDebugString输出调试信息

https://www.cnblogs.com/mushan/p/3351321.html

在编写控制台程序的时候我们经常会使用printf输出调试信息,使我们了解程序的状态,方便调试,但是当编写非控制台程序的时候这种方法就行不通了,那我们应该怎么办?上网查了一些方法,大致就如下几种

使用Log机制

用TRACE宏

其他

首先,使用Log机制的话要先写一个Log系统,麻烦。而关于TRACE宏,查了资料后才发现原来是MFC里的东西,那对于非MFC程序,就用不了了。 后来发现了OutputDebugString这玩意儿,发现不错。他是属于windows API的,所以只要是包含了window.h这个头文件后就可以使用了,很方便。他可以把调试信息输出到编译器的输出窗口,如下:还可以用DbgView这样的工具查看,这样就可以脱离编译器了。 下面说说如何使用OutputDebugString,他的函数原型是:

void WINAPI OutputDebugString( __in_opt  LPCTSTR lpOutputString);

就一个参数,是LPCTSTR 类型的。

这里我对这个API做了一些包装,当然,参考了一些文章:

//木杉的博客 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);}    
      
#endif    
      
#ifndef _DEBUG    
      
#define DP0(fmt) ;    
#define DP1(fmt, var) ;    
#define DP2(fmt,var1,var2) ;    
#define DP3(fmt,var1,var2,var3) ;    
      
#endif    
      
#endif

其中的DP就是表示BebugPrint。而且这些调试输出只会在BEBUG版本中有效,在Release版本中就不会有效。

这样使用:​ ​

//木杉的博客  http://www.cnblogs.com/mushan  
//2012年6月10日    
#include<stdio.h>   
#include"debugPrint.h"   
void main()   
{   
   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);   
}

不过,输出这些信息对程序还是有拖慢作用的,像我在写游戏是使用了这个输出调试信息就使帧率下降了不少,不过对于非游戏程序应该还是没有什么影响的。

2

Windows日志打印API的封装使用OutputDebugStringA
在C++编程中,经常会需要打印日志使用dbgview查看相应的一些信息,常用的是这样的:

#include <iostream>
#include <Windows.h>
#include <tchar.h>
using namespace std;
 
void DbgPrint(const TCHAR *format, ...)
{
	TCHAR buf[4096];
	va_list args;
	va_start(args, format);
	int len = _vstprintf(buf,format, args);
	va_end(args);
	OutputDebugString(buf);
}
void DbgPrint(const char *format, ...)  
{  
	char buf[4096], *p = buf;  
	va_list args;  
	va_start(args, format);  
	p += _vsnprintf(p, sizeof buf - 1, format, args);  
	va_end(args);  
	OutputDebugStringA(buf);  
}
 
int main()
{
	DbgPrint("nihao %s %d","lili",90);
	DbgPrint(_T("nihao %s %d"),_T("lili"),90);
	return 0;
}

上边是Unicode编码的,下边是普通单字节编码的,

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值