2009-06-24 16 views
9

हमारे पास एक बड़ा सी ++ एप्लिकेशन है, जिसे कभी-कभी हमें बग की जांच करने के लिए डीबग बिल्ड के रूप में चलाने की आवश्यकता होती है। डीबग बिल्ड रिलीज बिल्ड की तुलना में काफी धीमी है, लगभग अनुपयोगी होने के बिंदु पर।एमएसवीसी डीबग बनाने के लिए कैसे तेजी से चलते हैं

एमएसवीसी डीबग बनाने के लिए कौन सी चालें उपलब्ध हैं जो बहस पर बहुत अधिक बलिदान के बिना तेजी से निष्पादित करती हैं?

+0

क्यों यह एक समुदाय विकी है की जरूरत है? – Aamir

+0

मुझे अतीत में सभी प्रश्न "समुदाय विकी" बनाने के लिए कहा गया है। मैं वास्तव में नहीं जानता कि विकल्प क्या करता है। – pauldoo

+0

............ lol – demoncodemonkey

उत्तर

11

उपयोग #pragma optimize("", off) कि आप विज्ञप्ति में डिबग करने के लिए चाहते चयनित फ़ाइलों के शीर्ष पर। यह बेहतर स्टैक ट्रेस/परिवर्तनीय दृश्य देता है।

निर्माण अच्छी तरह से करता है, तो यह केवल कुछ फ़ाइलें आप में बग का पीछा करने।

+0

यह वही चाल है जिसे हमने बाद में खोजा और अब थोड़ी देर के लिए उपयोग कर रहा है। (मैं वापस आना और एसओ अपडेट करना भूल गया)। सही सिंटैक्स '#pragma ऑप्टिमाइज़ (" ", ऑफ) 'है, जिसे बाद में' #pragma ऑप्टिमाइज़ (" ", चालू) द्वारा किया जा सकता है, ताकि संकलक को सामान्य पर वापस रखा जा सके, इस प्रकार इस चाल का उपयोग किया जा सके एक समय में एकल कार्य। – pauldoo

+0

त्रुटि को इंगित करने के लिए धन्यवाद। मैंने इसे अपडेट किया है। – Macke

3

ऐप को प्रोफ़ाइल करें और देखें कि समय किस समय ले रहा है। तब आपको यह देखने में सक्षम होना चाहिए कि किस डिबगिंग को ट्यून किया जाना चाहिए।

+0

यह कैसे किया जाता है? और डीबग बिल्ड बनाने के साथ क्या करना है तेज़ी से बढ़ना? – Owl

1

डीबग बिल्ड और रिलीज बिल्ड के बीच कई अंतर हैं जो बहस और गति दोनों को प्रभावित करते हैं। _DEBUG/NDEBUG परिभाषित करने के लिए सबसे महत्वपूर्ण हैं, कंपाइलर अनुकूलन और डीबग जानकारी का निर्माण।

आप शायद तीसरे समाधान कॉन्फ़िगरेशन को बनाना और इन सेटिंग्स के साथ खेलना चाहें। उदाहरण के लिए, रिलीज बिल्ड में डीबग जानकारी जोड़ने से वास्तव में प्रदर्शन कम नहीं होता है लेकिन आपको पहले से ही एक समझदार स्टैक ट्रेस मिलता है ताकि आप जान सकें कि आप किस फ़ंक्शन में हैं। केवल कंपाइलर ऑप्टिमाइज़ेशन की वजह से लाइन जानकारी विश्वसनीय नहीं है।

यदि आप विश्वसनीय लाइन जानकारी चाहते हैं, तो आगे बढ़ें और अनुकूलन बंद करें। यह निष्पादन को थोड़ा धीमा कर देगा लेकिन यह तब भी सामान्य डीबग से तेज होगा जब तक कि _DEBUG परिभाषा अभी तक सेट नहीं है। फिर आप बहुत अच्छी डीबगिंग कर सकते हैं, केवल "सब कुछ जो" #ifdef _DEBUG "है या इसके आसपास समान नहीं होगा (उदा। इत्यादि कहने के लिए कॉल)।

आशा इस मदद करता है,

जनवरी

4

आप क्यों नहीं बस अपनी रिहाई विन्यास में डिबग जानकारी पर स्विच नहीं है?

+2

डीबग जानकारी पहले ही रिलीज में सक्षम है। समस्या यह है कि आक्रामक अनुकूलन के कारण डीबगर में कई चर अपठनीय हैं। – pauldoo

0

आप किस वीएस का उपयोग कर रहे हैं? हम हाल ही में VS.net से VS2008 तक चले गए और 500k LOC प्रोजेक्ट पर हाई एंड मशीन पर डिबगिंग करते समय मुझे एक ही धीमी गति का अनुभव हुआ। बाहर निकलता है, इंटेलिसेंस बेस दूषित हो जाता है और खुद को लगातार अद्यतन करता है लेकिन कहीं अटक जाता है। हटाने .ncb फ़ाइल समस्या हल हो गई।

1

क्या आप एमएफसी का उपयोग कर रहे हैं?

मेरे अनुभव में, मुख्य चीज जो डीबग संस्करण धीमा कर सकती है वह क्लास सत्यापन अवधि है, जो आमतौर पर रिलीज में अक्षम होती है। यदि डेटा संरचना सभी वृक्षों की तरह है, तो यह सैकड़ों बार उप-प्रमाणीकरण को फिर से सत्यापित कर सकती है।

भले ही, रिलीज बिल्ड की तुलना में 10 गुना धीमी गति से कहें, इसका मतलब है कि यह आवश्यक समय में 1/10 खर्च कर रहा है, और 9/10 कुछ और कर रहा है। यदि, आप इसके लिए प्रतीक्षा कर रहे हैं, तो आप बस "रोकें" बटन दबाएं और कॉल स्टैक को देखें, संभावना 9/10 है कि आप देखेंगे कि समस्या वास्तव में क्या है।

It's a quick & dirty, but effective way to find performance problems.

4

हम पूर्वप्रक्रमक प्रतीकों के साथ इटरेटर डिबगिंग बंद कर दिया:

_HAS_ITERATOR_DEBUGGING=0 
_SCL_SECURE=0 

यह थोड़ा मदद की, लेकिन अभी भी रूप में तेजी से नहीं के रूप में हम चाहते हैं था। हमने _deBUG के बजाय एनडीईबीयूजी को परिभाषित करके हमारे डीबग को और अधिक रिलीज बनाने की तरह समाप्त कर दिया। कुछ अन्य विकल्प थे जिन्हें हमने भी बदल दिया, लेकिन मैं उन्हें याद नहीं कर रहा हूं।

यह दुर्भाग्यपूर्ण है कि हमें यह सब करने की ज़रूरत है, लेकिन हमारे आवेदन में प्रत्येक 50ms या इसके अनुपयोगी होने के लिए आवश्यक कार्य की एक निश्चित मात्रा है।बॉक्स के बाहर VS2008 हमें डीबग के लिए ~ 60ms बार और रिलीज के लिए ~ 6ms बार देगा। ऊपर उल्लिखित tweaks के साथ हम ~ 20ms या तो डीबग हो सकता है, जो कम से कम उपयोग करने योग्य है।

+0

बस इसे फ्लैट आउट चलाने दें (यानी लगातार, टाइमर-ट्रिगर नहीं)। वह 10: 1 डीबग: रिलीज मंदी जो आप देख रहे हैं वह इस तरह की चीज है जो इस तकनीक के साथ वास्तव में आसान है: http://stackoverflow.com/questions/375913/what-can-i-use-to -प्रोफाइल-सी-कोड-इन-लिनक्स/378024 # 378024 –

+0

... यहां तक ​​कि 20: 6 मंदी पर, इसका मतलब है कि 70% समय बर्बाद हो गया है। तो यदि आप 10 नमूने लेते हैं, तो आपको 7 +/- 1.45 नमूनों पर ढेर पर कारण दिखाई देगा, और ढेर आपको बताएगा कि यह क्यों कर रहा है, और यह एक खराब कारण होगा, कि आप एक कार्य-आसपास मिल सकते हैं । –

+0

मैं वास्तव में इस पर एक प्रोफाइलर भाग गया। समस्या कई तरीकों से फैल गई थी और ऐसा लगता था कि फंक्शन हेडर शरीर को हर समय खा रहे थे। मैंने निष्कर्ष निकाला कि अतिरिक्त जांच के कारण दृश्य स्टूडियो डीबग मोड में कर रहा था। – MrSlippers

2

एक ReleaseWithSymbols विन्यास, कि NDEBUG को परिभाषित करता है और कोई अनुकूलन सक्षम है बनाएँ। डीबगिंग के लिए सटीक प्रतीकों को बनाए रखते हुए यह आपको बेहतर प्रदर्शन देगा।

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