2008-08-26 11 views
10

TRACE macroडीबग मोड में संकलित होने पर डीबगर को डायग्नोस्टिक संदेशों को आउटपुट करने के लिए उपयोग किया जा सकता है। मुझे रिलीज मोड में एक ही संदेश की आवश्यकता है। क्या इसको हासिल करने के लिए कोई रास्ता है?रिलीज मोड में TRACE मैक्रो को कैसे सक्षम करें?

(कृपया कर नहीं बर्बाद अपना समय की चर्चा मैं रिलीज मोड में ट्रेस का उपयोग किया जा नहीं करना चाहिए :-)

+0

देख ATL के लिए मिलेगा प्रोजेक्ट्स में मेरे पास एक ड्रॉप-इन क्लास है जो 'ATLTRACE' मैक्रोज़ और मैप्स को फिर से परिभाषित करती है 'आउटपुटडिबगस्ट्रिंग' (पैरामीटर की लचीली संख्या को स्वीकार करने सहित): http://alax.info/blog/tag/outputdebugstring –

उत्तर

8

दरअसल, TRACE मैक्रो आउटपुटडिबगस्ट्रिंग की तुलना में बहुत अधिक लचीला है। यह एक printf() शैली प्रारूप स्ट्रिंग और पैरामीटर सूची लेता है जबकि आउटपुटडिबगस्ट्रिंग केवल एक स्ट्रिंग लेता है। आदेश रिलीज़ मोड में पूर्ण ट्रेस कार्यक्षमता लागू करने के लिए आप कुछ इस तरह करने की जरूरत है:

void trace(const char* format, ...) 
{ 
    char buffer[1000]; 

    va_list argptr; 
    va_start(argptr, format); 
    wvsprintf(buffer, format, argptr); 
    va_end(argptr); 

    OutputDebugString(buffer); 
} 
+4

मुझे पता है कि यह सिर्फ एक उदाहरण है, लेकिन इस उदाहरण में एक बड़ी बफर ओवररन क्षमता है। – Aardvark

1

MFC में, ट्रेस ATLTRACE के रूप में परिभाषित किया गया है। और रिलीज़ मोड में परिभाषित किया गया है कि के रूप में:

#define ATLTRACE   __noop 

तो, MFC से बाहर-द-बॉक्स ट्रेस का उपयोग कर, आप वास्तव में किसी भी ट्रेस पाठ को पढ़ने में सक्षम, नहीं होगा, क्योंकि यह भी लिखा नहीं की जाएगी बाहर। आप इसके बजाय अपना खुद का ट्रैस फ़ंक्शन लिख सकते हैं, फिर TRACE मैक्रो को फिर से परिभाषित कर सकते हैं। आप कुछ इस तरह कर सकता है:

void MyTrace(const CString& text) 
{ 
    ::OutputDebugString(text); // Outputs to console, same as regular TRACE 
    // TODO: Do whatever output you need here. Write to event log/write to text file/write to pipe etc. 
} 
2

ट्रेस सिर्फ OutputDebugString के लिए एक मैक्रो है। तो आप आसानी से अपना खुद का ट्रेक मैक्रो (या इसे कुछ और कह सकते हैं) बना सकते हैं जो OutputDebugString पर कॉल करेगा।

4

कुछ साल वापस मैं इसी तरह की सुविधा की जरूरत तो मैं एक साथ निम्नलिखित कोड पत्थर। बस इसे एक फाइल में सहेजें, उदा। rtrace.h, इसे अपने stdafx.h के अंत में शामिल करें, और रिलीज मोड में _RTRACE जोड़ें प्रीप्रोसेसर परिभाषित करता है।

हो सकता है कि किसी को जॉन :-)

इसके लिए एक प्रयोग

 
#pragma once 

//------------------------------------------------------------------------------------------------ 
// 
// Author: John Cullen 
// Date:  2006/04/12 
// Based On: MSDN examples for variable argument lists and ATL implementation of TRACE. 
// 
// Description: Allows the use of TRACE statements in RELEASE builds, by overriding the 
// TRACE macro definition and redefining in terms of the RTRACE class and overloaded 
// operator(). Trace output is generated by calling OutputDebugString() directly. 
// 
// 
// Usage: Add to the end of stdafx.h and add _RTRACE to the preprocessor defines (typically 
//   for RELEASE builds, although the flag will be ignored for DEBUG builds. 
// 
//------------------------------------------------------------------------------------------------ 

#ifdef _DEBUG 

// NL defined as a shortcut for writing FTRACE(_T("\n")); for example, instead write FTRACE(NL); 
#define NL _T("\n") 
#define LTRACE TRACE(_T("%s(%d): "), __FILE__, __LINE__); TRACE 
#define FTRACE TRACE(_T("%s(%d): %s: "), __FILE__, __LINE__, __FUNCTION__); TRACE 

#else // _DEBUG 

#ifdef _RTRACE 
#undef TRACE 
#define TRACE RTRACE() 
#define LTRACE RTRACE(__FILE__, __LINE__) 
#define FTRACE RTRACE(__FILE__, __LINE__, __FUNCTION__) 
#define NL _T("\n") 

class RTRACE 
{ 
public: 
    // default constructor, no params 
    RTRACE(void) : m_pszFileName(NULL), m_nLineNo(0), m_pszFuncName(NULL) {}; 

    // overloaded constructor, filename and lineno 
    RTRACE(PCTSTR const pszFileName, int nLineNo) : 
     m_pszFileName(pszFileName), m_nLineNo(nLineNo), m_pszFuncName(NULL) {}; 

    // overloaded constructor, filename, lineno, and function name 
    RTRACE(PCTSTR const pszFileName, int nLineNo, PCTSTR const pszFuncName) : 
     m_pszFileName(pszFileName), m_nLineNo(nLineNo), m_pszFuncName(pszFuncName) {}; 

    virtual ~RTRACE(void) {}; 

    // no arguments passed, e.g. RTRACE()() 
    void operator()() const 
    { 
     // no arguments passed, just dump the file, line and function if requested 
     OutputFileAndLine(); 
     OutputFunction(); 
    } 

    // format string and parameters passed, e.g. RTRACE()(_T("%s\n"), someStringVar) 
    void operator()(const PTCHAR pszFmt, ...) const 
    { 
     // dump the file, line and function if requested, followed by the TRACE arguments 
     OutputFileAndLine(); 
     OutputFunction(); 

     // perform the standard TRACE output processing 
     va_list ptr; va_start(ptr, pszFmt); 
     INT len = _vsctprintf(pszFmt, ptr) + 1; 
     TCHAR* buffer = (PTCHAR) malloc(len * sizeof(TCHAR)); 
     _vstprintf(buffer, pszFmt, ptr); 
     OutputDebugString(buffer); 
     free(buffer); 
    } 

private: 
    // output the current file and line 
    inline void OutputFileAndLine() const 
    { 
     if (m_pszFileName && _tcslen(m_pszFileName) > 0) 
     { 
      INT len = _sctprintf(_T("%s(%d): "), m_pszFileName, m_nLineNo) + 1; 
      PTCHAR buffer = (PTCHAR) malloc(len * sizeof(TCHAR)); 
      _stprintf(buffer, _T("%s(%d): "), m_pszFileName, m_nLineNo); 
      OutputDebugString(buffer); 
      free(buffer); 
     } 
    } 

    // output the current function name 
    inline void OutputFunction() const 
    { 
     if (m_pszFuncName && _tcslen(m_pszFuncName) > 0) 
     { 
      INT len = _sctprintf(_T("%s: "), m_pszFuncName) + 1; 
      PTCHAR buffer = (PTCHAR) malloc(len * sizeof(TCHAR)); 
      _stprintf(buffer, _T("%s: "), m_pszFuncName); 
      OutputDebugString(buffer); 
      free(buffer); 
     } 
    } 

private: 
    PCTSTR const m_pszFuncName; 
    PCTSTR const m_pszFileName; 
    const int m_nLineNo; 
}; 

#endif // _RTRACE 

#endif // NDEBUG 

2

यह सबसे बस कोड है कि मैं था देख रहा है

#undef ATLTRACE 
#undef ATLTRACE2 

#define ATLTRACE2 CAtlTrace(__FILE__, __LINE__, __FUNCTION__) 
#define ATLTRACE ATLTRACE2 

http://alax.info/blog/1351

संबंधित मुद्दे