天天看點

擴充OutputDebugString,自定義Trace

#ifdef _DEBUG
    //    對應Unicode的調試輸出
    inline void MyTraceW(LPCTSTR strFormat, ...)
    {
        const int BUFFER_SIZE = 128;
        va_list args = NULL;
        va_start(args, strFormat);
        TCHAR szBuffer[BUFFER_SIZE] = { 0 };
        _vsntprintf(szBuffer, BUFFER_SIZE, strFormat, args);//_vsnwprintf for Unicode
        va_end(args);
        ::OutputDebugString(szBuffer);
    }
    //    對應ASCII的調試輸出
    inline void MyTraceA(const char* strFormat, ...)
    {
        const int BUFFER_SIZE = 128;
        char   szBuffer [BUFFER_SIZE] = {0};
        va_list args = NULL;

        // The va_start macro (defined in STDARG.H) is usually equivalent to:
        // pArgList = (char *) &szFormat + sizeof (szFormat) ;
        va_start (args, strFormat) ;

        // The last argument to wvsprintf points to the arguments
        _vsnprintf ( szBuffer, BUFFER_SIZE, strFormat, args) ;

        // The va_end macro just zeroes out pArgList for no good reason
        va_end (args);
        ::OutputDebugStringA (szBuffer);
    }
#endif // _DEBUG
};
           
在軟體的開發過程裡,大部份時間是在做什麼呢?其實是在調試代碼,畢竟人類的思維方式是從簡單到複雜的過程,自然的認知過程也是從簡單到複雜。是以,開發軟體時,第一個版本總是先寫簡單的,然後慢慢地添加出錯處理上去,也把一些沒有想到的情況添加進去,那些沒有想到的錯誤,就叫做BUG。要根除一個軟體裡的BUG,是一件不容易的事情,不但要對這個軟體流程比較熟悉,還要對這個軟體的目标比較了解,還需要對這個開發平台了解,當然還需要不斷地測試不同的條件是否出錯。軟體的條件組合是2的N次方,是以不可能把所有組合都測試完成,隻能選擇比較重要的進行測試,隻要不影響軟體的使用,這個軟體就算是一款能夠掙錢的軟體了,不要希望這個軟體一點BUG都不出現,那是不現實的,或者說付出的代價也太大了,導緻這個軟體的開發成本過高,公司當然是不能生存下去。是以,怎麼樣去平衡可使用性與軟體的BUG,就成為一件藝術的事情。不同的場合是不同的需求的,一定不要為了完美而完美。下面就介紹怎麼樣使用OutputDebugString來輸出調試資訊到開發平台裡。      
 
 
 
   
 
 
  
  
   TRACE和OutputDebugString的差別 
  
  
   TRACE() is a part of MFC.
OutputDebugString is Windows API.

TRACE is a macro. It will be removed in Release built.

You can do printf() like format in TRACE() but not OutputDebugString:
    TRACE("The number is %d\n", i);


  
       

繼續閱讀