2012-11-21 15 views
15

एमएफसी से आ रहा है, मैंने qDebug() को TRACE() की तरह माना, यह मानते हुए कि इसे प्रीप्रोसेसर द्वारा रिलीज बिल्ड से हटा दिया गया है (एमएफसी में यह #define TRACE 1 ? (void*) 0 : AfxTrace का उपयोग करके किया गया है)।रिलीज में qDebug काम क्यों करता है?

मेरे आश्चर्य के लिए, हालांकि qDebug() रिलीज बिल्ड में भी निष्पादित किया गया है। मैं इसे कैसे बदलूं? और यह भी क्यों है, इस निर्णय के पीछे क्यूटी के डेवलपर्स का तर्क क्या था?

+0

उपयोगी लिंक: http://qt-project.org/forums/viewthread/25512 और http://supportforums.blackberry.com/t5/Native- विकास /Dealing-with-qDebug-in-release-candidate/ टीडी-पी/2078713 – x29a

उत्तर

22

qDebug प्रीप्रोसेसर नियंत्रित भी है, लेकिन इसका अपना विशेष मैक्रो, QT_NO_DEBUG_OUTPUT है। यदि आप इसे अपने रिलीज बिल्ड परिभाषित करते हैं, तो इसे हटा दिया जाएगा।

+0

तो यह डिफ़ॉल्ट रूप से क्यों सेट नहीं है? उस पर फैसला करने का एक कारण होना चाहिए। – sashoalm

+0

@Sashoalm मेरा अनुमान यह होगा कि [लोग stdout से stdin को अलग करने के लिए हमेशा सावधान नहीं हैं] (http://stackoverflow.com/a/3886128/1858225) (उस उत्तर पर टिप्पणियां देखें, साथ ही साथ मेरा उत्तर भी देखें यह; मूल उत्तर में केवल पहले कोड ब्लॉक शामिल थे), और डिफ़ॉल्ट रूप से रिलीज बिल्ड से काफी अलग तरीके से व्यवहार करने के लिए डिबग बिल्ड का कारण बनना बुरा व्यवहार होगा। –

+0

@KyleStrand आपका मतलब है 'stdout' और 'stderr', है ना? – Angew

16

क्यूडीबग "डीबगिंग जानकारी के लिए आउटपुट स्ट्रीम" है। इसमें डिफ़ॉल्ट व्यवहार चुड़ैल संदेश प्रकार के आधार पर stdout/stderr को प्रिंट कर रहा है। आप अपने संदेश हैंडलर को इंस्टॉल करके आसानी से qDebug() व्यवहार को कस्टमाइज़ कर सकते हैं। उदाहरण के लिए यदि आप डीबग प्रिंट करना चाहते हैं तो आप रनटाइम (समय संकलित नहीं) पर परीक्षण कर सकते हैं। इस कोड को नमूना पर एक नज़र डालें:

#include <QDebug> 

void noMessageOutput(QtMsgType type, const char *msg) 
{ 
    Q_UNUSED(type); 
    Q_UNUSED(msg); 
} 

int main(int argc, char * argv[]) 
{ 
    QApplication app(argc, argv); 

    if (! app.arguments().contains(QLatin1String("--with-debug")) { 
     qInstallMsgHandler(noMessageOutput); 
    } 
} 

यह पूरी qDebug उत्पादन छुपा देगा अगर कोई पैरामीटर रनटाइम के दौरान निर्दिष्ट है। आपको "डीबग दिखाएं/डीबग न दिखाएं" से अधिक नियंत्रण प्राप्त करें

साथ ही आप QT_NO_DEBUG_OUTPUT के साथ QDebug को पूरी तरह से अक्षम कर सकते हैं यदि आप कोड के भीतर मौजूद qDebug के साथ खोए गए प्रदर्शन के बारे में चिंतित हैं। रिलीज़ मोड में संदेशों को दबाने

0

इस प्रयोग के लिए, लेकिन उन्हें डिबग मोड में अनुमति देते हैं:

CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 

आप केवल DEFINES += QT_NO_DEBUG_OUTPUTCONFIG(...) हिस्सा बिना उपयोग करते हैं तो आप उन्हें दोनों मोड, जो आमतौर पर वांछनीय नहीं है में अक्षम हो जाएगा।

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