2009-01-16 12 views
8

एमएफसी सी ++ (विजुअल स्टूडियो 6) में मुझे डीबगिंग के लिए TRACE मैक्रो का उपयोग करने के लिए उपयोग किया जाता है। सादा win32 के लिए एक समकक्ष बयान है?क्या मूल Win32 C++ के लिए कोई TRACE कथन है?

+0

कोई भी आज भी दृश्य स्टूडियो 6 का उपयोग क्यों करता है। 2005 और अब 2008 लंबे समय से मुक्त रहे हैं। –

उत्तर

7

_RPTn बहुत अच्छा काम करता है, हालांकि काफी सुविधाजनक नहीं है। Here is some code जो MFC TRACE कथन को फ़ंक्शन के रूप में पुन: प्रयास करता है जो तर्कों की परिवर्तनीय संख्या को अनुमति देता है। TraceEx मैक्रो भी जोड़ता है जो स्रोत फ़ाइल और लाइन नंबर तैयार करता है ताकि आप कथन के स्थान पर वापस क्लिक कर सकें।

अद्यतन: कोडगुरु पर मूल कोड रिलीज मोड में मेरे लिए संकलित नहीं होगा, इसलिए मैंने रिलीज मोड के लिए TRACE कथन हटा दिए जाने का तरीका बदल दिया। यहां मेरा पूरा स्रोत है जिसे मैंने Trace.h में रखा है। मूल के लिए थॉमस Rizos को धन्यवाद:

// TRACE macro for win32 
#ifndef __TRACE_H__850CE873 
#define __TRACE_H__850CE873 

#include <crtdbg.h> 
#include <stdarg.h> 
#include <stdio.h> 
#include <string.h> 

#ifdef _DEBUG 
#define TRACEMAXSTRING 1024 

char szBuffer[TRACEMAXSTRING]; 
inline void TRACE(const char* format,...) 
{ 
    va_list args; 
    va_start(args,format); 
    int nBuf; 
    nBuf = _vsnprintf(szBuffer, 
        TRACEMAXSTRING, 
        format, 
        args); 
    va_end(args); 

    _RPT0(_CRT_WARN,szBuffer); 
} 
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \ 
       &strrchr(__FILE__,'\\')[1],__LINE__); \ 
       _RPT0(_CRT_WARN,szBuffer); \ 
       TRACE 
#else 
// Remove for release mode 
#define TRACE ((void)0) 
#define TRACEF ((void)0) 
#endif 

#endif // __TRACE_H__850CE873 
+0

अच्छा, यह एक उपयोगी स्निपेट है। –

+0

szBuffer वैश्विक नहीं होना चाहिए यदि आप एक से अधिक थ्रेड – Anders

+0

अच्छे बिंदु में TRACE का उपयोग कर रहे हैं - मुझे लगता है कि अगर मैं केवल TRACE फ़ंक्शन के अंदर घोषणा को स्थानांतरित करता हूं तो यह TRACEF मैक्रो को तोड़ देगा हालांकि - क्या यह सच है? – jacobsee

3

MSDN डॉक्स से, Macros for Reporting:

आप डीबगिंग के लिए printf बयान के उपयोग को बदलने के लिए _RPTn, और _RPTFn मैक्रो, CRTDBG.H में परिभाषित है, का उपयोग कर सकते हैं। _DEBUG परिभाषित नहीं होने पर ये मैक्रोज़ स्वचालित रूप से आपके रिलीज़ बिल्ड में गायब हो जाते हैं, इसलिए उन्हें #ifdefs में संलग्न करने की आवश्यकता नहीं है।

3

वहाँ भी OutputDebugString है। हालांकि रिलीज संकलित करते समय इसे हटाया नहीं जाएगा।

1

ट्रेस मैक्रो कि स्रोत कोड लिंक, रन-टाइम callstack जानकारी, और समारोह प्रोटोटाइप पैरामीटर मान के साथ जानकारी के साथ संदेशों प्रदान करते हैं:

Extended Trace: Trace macros for Win32

1

मैंने पाया कि का उपयोग करते हुए _RPT() मैक्रो विजुअल स्टूडियो 2005 में सी स्रोत फ़ाइल के साथ भी काम करेगा। यह आलेख Debugging with Visual Studio 2005/2008: Logging and Tracing TRACE, _RPT, और अन्य लॉगिंग प्रकार का एक अवलोकन प्रदान करता है मैक्रो।

मैं एक लॉग ASSRTLOG जो लॉग होता है और कहा जाता है फ़ाइल के लिए एक लाइन उत्पन्न जब फाइल करने के लिए लॉग लेखन, मैं भी निम्नलिखित स्रोत कोड लाइन कार्य करें:

_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1); 

इस लाइन में एक ही लॉग डालता है विजुअल स्टूडियो 2005 आईडीई की आउटपुट विंडो में लॉग फ़ाइल में जा रहा है।

लॉगिंग के लिए हम जिस दृष्टिकोण का उपयोग कर रहे हैं उसके पीछे यांत्रिकी में रुचि हो सकती है। हमारे पास एक कार्य PifLogAbort() है जो तर्क उत्पन्न करने के लिए उपयोग किए जाने वाले तर्कों की एक श्रृंखला स्वीकार करता है। इन तर्कों में फ़ाइल का नाम शामिल है जहां लॉग संख्या के साथ लॉग उत्पन्न किया जा रहा है।मैक्रो इस तरह दिखता है:

#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort((UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) txt , __LINE__);} 

और इस तरह PifLogAbort() देखने के लिए समारोह प्रोटोटाइप:

PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo) 

और मैक्रो का उपयोग करने में हम इस तरह की एक पंक्ति से जोड़ दिया जाएगा:

NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn(): EtkTimeIn() returned error"); 

यह मैक्रो क्या करेगा यह है कि यदि रिटर्न कोड 0 से कम है (दावा विफल रहता है), प्रदान किए गए टेक्स्ट के साथ एक लॉग उत्पन्न किया जाएगा। लॉग में ऐसी स्थिति शामिल होती है जो फ़ाइल नाम और लाइन नंबर के साथ लॉग उत्पन्न करती है।

समारोह PifLogAbort() एक निर्दिष्ट लंबाई के साथ लॉग उत्पन्न करता है और एक परिपत्र बफर के रूप में आउटपुट फ़ाइल व्यवहार करता है। लॉग में एक समय और तारीख टिकट भी है।

उन मामलों में जहाँ हम शायद वास्तविक त्रुटि कोड मूल्य प्रदान करने के लिए रन टाइम पर गतिशील रूप से वर्णनात्मक पाठ उत्पन्न करना चाहते हैं, में, हमने निम्न कोड अनुक्रम में के रूप में एक बफर के साथ sprintf() फ़ंक्शन का उपयोग:

if (sErrorSave != STUB_BM_DOWN) { 
    char xBuff[128]; 
    sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError); 
    NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff); 
} 

अगर हम लॉग उत्पन्न नहीं करना चाहते हैं, तो हमें केवल एक ही शीर्षलेख फ़ाइल पर जाना है जहां मैक्रो परिभाषित किया गया है और इसे फिर से संकलित करने के लिए परिभाषित नहीं किया गया है। हालांकि हमने पाया है कि फील्ड लॉग की जांच करते समय ये लॉग बहुत मूल्यवान हो सकते हैं और विशेष रूप से एकीकरण परीक्षण के दौरान उपयोगी होते हैं।

2

मैं बस कुछ इस तरह का उपयोग करें (स्मृति, सब पर परीक्षण नहीं से ...)

#define TRACE(msg) {\ 
    std::ostringstream ss; \ 
    ss << msg << "\n"; \ 
    OutputDebugString(msg.str()); \ 
} 

और फिर मैं जैसी चीजों के बारे में कर सकते हैं: -

TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data); 

आप लपेट कर सकते हैं कि में रिलीज में इसे हटाने के लिए कुछ #ifdefs आसानी से पर्याप्त बनाता है।

+1

बस थोड़ा सा फिक्स: 'आउटपुटडिबगस्ट्रिंग (ss.str()। C_str()); 'आउटपुटडिबगस्ट्रिंग (msg.str()) के बजाय उपयोग किया जाना चाहिए;' – Apokal

0

Windows Events आपके विशेष परिदृश्य के आधार पर TRACE मैक्रोज़ के लिए संभावित प्रतिस्थापन हैं। कोड डीबग और रिलीज कॉन्फ़िगरेशन दोनों में संकलित हो जाता है। इवेंट ट्रेसिंग को गतिशील रूप से सक्षम और अक्षम किया जा सकता है, वास्तविक समय में प्रदर्शित किया जा सकता है, या बाद में निदान के लिए ग्राहक की मशीन पर डंप किया जा सकता है। निशान ओएस के अन्य हिस्सों से एकत्रित ट्रेस जानकारी के साथ भी सहसंबंधित किया जा सकता है।

यदि आपको कोड को कुछ निश्चित चेकपॉइंट तक पहुंचने की आवश्यकता होती है, तो परिवर्तनीय सामग्री, स्टैक निशान या कॉलर नामों के साथ, विजुअल स्टूडियो के Tracepoints ऐसा करने के लिए एक गैर-घुसपैठ करने वाला विकल्प होता है।

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