使用OutputDebugString將調試信息輸出

    在編寫控制檯程序的時候我們經常會使用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!\n"); 
  10.         DP0("這是調試信息!\n"); 
  11.         DP1("這是調試信息%d\n",i); 
  12.         DP2("這是調試信息%d--%d\n",i,i+1); 
  13.         DP3("這是調試信息%d--%d--%d\n",i,i+1,i+2); 
  14.     } 
  15.     getc(stdin); 

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章