使用OutputDebugString輸出調試信息


在編寫控制台程序的時候我們經常會使用printf輸出調試信息,使我們了解程序的狀態,方便調試,但是當編寫非控制台程序的時候這種方法就行不通了,那我們應該怎么辦?上網查了一些方法,大致就如下幾種

  • 使用Log機制

  • 用TRACE宏

  • 其他

首先,使用Log機制的話要先寫一個Log系統,麻煩。而關於TRACE宏,查了資料后才發現原來是MFC里的東西,那對於非MFC程序,就用不了了。    后來發現了OutputDebugString這玩意兒,發現不錯。他是屬於windows API的,所以只要是包含了window.h這個頭文件后就可以使用了,很方便。他可以把調試信息輸出到編譯器的輸出窗口,如下:還可以用DbgView這樣的工具查看,這樣就可以脫離編譯器了。    下面說說如何使用OutputDebugString,他的函數原型是:

1
void WINAPI OutputDebugString( __in_opt  LPCTSTR lpOutputString);

就一個參數,是LPCTSTR 類型的。

這里我對這個API做了一些包裝,當然,參考了一些文章: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//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版本中就不會有效。

這樣使用:​ ​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//木杉的博客  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);  
}

 

不過,輸出這些信息對程序還是有拖慢作用的,像我在寫游戲是使用了這個輸出調試信息就使幀率下降了不少,不過對於非游戲程序應該還是沒有什么影響的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM