zoukankan      html  css  js  c++  java
  • 使用OutputDebugString将调试信息输出

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mazhibin.blog.51cto.com/4842922/894427

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

    • 使用Log机制
    • 用TRACE宏
    • 其他

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

    void WINAPI OutputDebugString( __in_opt  LPCTSTR lpOutputString);

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

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

    1. //木杉的博客  http://blog.csdn.net/mazhibinit  
    2. //2012年6月10日         ------转载请注明出处  
    3.  
    4. #ifndef _DEBUGPRINTF_H_ 
    5. #define _DEBUGPRINTF_H_ 
    6.  
    7. #include<Windows.h> 
    8. #include <tchar.h> 
    9.  
    10. //用于输出信息到编译器输出窗口的宏定义 
    11. //使用win API,DEBUG版本会执行,RELEASE版本则不会 
    12. //还可以使用DebugView,WinDbg等工具查看输出 
    13.  
    14. #ifdef _DEBUG 
    15.  
    16. #define DP0(fmt) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt));OutputDebugString(sOut);} 
    17. #define DP1(fmt,var) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var);OutputDebugString(sOut);} 
    18. #define DP2(fmt,var1,var2) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2);OutputDebugString(sOut);} 
    19. #define DP3(fmt,var1,var2,var3) {TCHAR sOut[256];_stprintf_s(sOut,_T(fmt),var1,var2,var3);OutputDebugString(sOut);} 
    20.  
    21. #endif 
    22.  
    23. #ifndef _DEBUG 
    24.  
    25. #define DP0(fmt) ; 
    26. #define DP1(fmt, var) ; 
    27. #define DP2(fmt,var1,var2) ; 
    28. #define DP3(fmt,var1,var2,var3) ; 
    29.  
    30. #endif 
    31.  
    32. #endif 

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

    这样使用:

    1. //木杉的博客  http://blog.csdn.net/mazhibinit  
    2. //2012年6月10日         ------转载请注明出处  
    3.  
    4. #include<stdio.h> 
    5. #include"debugPrint.h" 
    6. void main() 
    7.     for(int i=0;i<10;i++) 
    8.     { 
    9.         printf("hello! "); 
    10.         DP0("这是调试信息! "); 
    11.         DP1("这是调试信息%d ",i); 
    12.         DP2("这是调试信息%d--%d ",i,i+1); 
    13.         DP3("这是调试信息%d--%d--%d ",i,i+1,i+2); 
    14.     } 
    15.     getc(stdin); 

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

  • 相关阅读:
    J2EE(一)——开发简单WEB服务器
    日报--2015年7月10日
    MVC @Html控件(转载)
    Asp.NET MVC--【Asp.net】
    附加到进程 调试技巧--【VS】
    快速阅读学习方法笔记
    匿名函数和闭包--【JavaScript】
    Repeater显示数据--[Asp.Net]
    FileUpLoad上传文件--[Asp.Net]
    35Canlender--[Asp.Net]
  • 原文地址:https://www.cnblogs.com/For-her/p/3465521.html
Copyright © 2011-2022 走看看