2009-06-01 13 views
7

क्या डीबीगर (या सीएलआर अपवाद हैंडलर) के लिए यह लाइन दिखाने के लिए संभव है जहां पीडीबी का उपयोग कर रिलीज मोड में अपवाद हुआ?रिलीज मोड में पीडीबी से लाइन नंबर प्राप्त करना

कोड, रिलीज मोड में, अनुकूलित किया गया है और हमेशा "मूल" कोड के आदेश और तर्क का पालन नहीं करता है।

यह भी आश्चर्य की बात है कि डीबगर रिलीज मोड में भी मेरे कोड चरण के माध्यम से नेविगेट कर सकता है। अनुकूलन नेविगेशन को बहुत ही असुविधाजनक बनाना चाहिए।

तुम मेरे लिए उन दो बिंदुओं को स्पष्ट कर सकते हैं?

उत्तर

10

मैं सीएलआर के साथ यह कैसे परिचित नहीं हूं, लेकिन यह शायद मूल कोड के साथ कैसे किया जाता है, यह बहुत ही समान है। जब संकलक मशीन निर्देश उत्पन्न करता है, तो यह पीडीबी में प्रविष्टियों को जोड़ता है जो मूल रूप से "वर्तमान पते पर निर्देश, एक्स, foo.cpp में लाइन 25 से आया" कहता है।

डिबगर जानता है क्या कार्यक्रम का पता वर्तमान में क्रियान्वित किया गया है। तो यह पीडीबी में कुछ पता, एक्स देखता है और देखता है कि यह foo.cpp में लाइन 25 से आया था। इसका उपयोग करके, यह आपके स्रोत कोड के माध्यम से "कदम" करने में सक्षम है।

यह प्रक्रिया डीबग या रिलीज मोड के बावजूद समान है (बशर्ते कि एक पीडीबी रिलीज मोड में उत्पन्न हो)। हालांकि, आप सही हैं, हालांकि ऑप्टिमाइज़ेशन के कारण रिलीज मोड में अक्सर डीबगर कोड के माध्यम से "रैखिक रूप से" कदम नहीं उठाएगा। यह अनपेक्षित रूप से विभिन्न लाइनों के आसपास कूद सकता है। यह ऑप्टिमाइज़र के निर्देशों के क्रम को बदलने के कारण है, लेकिन यह पता-से-स्रोत-लाइन मैपिंग को नहीं बदलता है, इसलिए डीबगर अभी भी इसका पालन करने में सक्षम है।

+0

टा। चीजें अब मेरे लिए स्पष्ट हैं। –

0

डिबगर जहां यह समस्या उत्पन्न हुई पर एक सबसे अच्छा प्रयास अनुमान बनाता है। यह 100% सटीक होने की गारंटी नहीं है, और पूरी तरह से अनुकूलित कोड के साथ, यह अक्सर गलत होगा - मुझे कुछ लाइनों से पूरी तरह से गलत कॉल स्टैक होने के कारण कहीं भी त्रुटियां मिली हैं।

अनुकूलित कोड के साथ डीबगर कितना सटीक है वास्तव में कोड पर निर्भर करता है और आप कौन सी अनुकूलन बना रहे हैं।

+1

Ty। "पूरी तरह से गलत कॉल स्टैक होने के लिए।" स्टैक ट्रेस हमेशा सटीक नहीं होना चाहिए? –

+0

क्या लाइन नंबरों पर कोई स्रोत या अधिक जानकारी है? मैंने डीबगिंग/पीडीबी/कंपाइलर कोड अनुकूलन पर SO पर कुछ पोस्ट लाल कर दी हैं, और इस पर कोई स्पष्ट बिंदु नहीं मिला है। आपके विस्तृत उत्तर के लिए – gerleim

1

[@Not ज़रूर] यह लगभग का अधिकार है। कंपाइलर एक उचित लाइन संख्या की पहचान करने का सबसे अच्छा प्रयास करता है जो वर्तमान मशीन कोड निर्देश से निकटता से मेल खाता है।

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

भले ही, डीबगर को वर्तमान आईपी (निर्देश सूचक) में निकटतम पीडीबी मानचित्र में प्रवेश (जैसे "पहले या बराबर") में प्रविष्टि मिलती है और उस रेखा को हाइलाइट करता है।

कभी-कभी मैच बहुत अच्छा नहीं होता है, और यह तब होता है जब आप पूरे स्थान पर हाइलाइट किए गए क्षेत्र को देखते हैं।

+1

शायद संकलक रिलीज के लिए और डीबग मोड के लिए एक अलग पीडीबी उत्पन्न करता है। रिलीज मोड के लिए पीडीबी ऑप्टिमाइज़ेशन पर विचार करता है, इसलिए यह अपवाद के लिए अपेक्षाकृत सटीक रेखा दे सकता है। –

+0

ओह, बिल्कुल। पीडीबी हमेशा डीएलएल (या EXE) के सटीक उदाहरण से जुड़ा हुआ है जिसके साथ इसे बनाया गया था। ध्यान दें कि यदि आप किसी भी स्रोत फ़ाइल में परिवर्तन के बिना उसी मोड में पुन: संकलित करते हैं, तो भी आप पीडीबी और डीएलएल मिश्रण और मिलान नहीं कर सकते हैं। आपका पीडीबी वही सटीक होना चाहिए जो बनाया गया था जब मॉड्यूल (डीएलएल या EXE) जिसे आप डिबगिंग कर रहे थे संकलित किया गया था क्योंकि संकलक प्रत्येक बिल्ड पर अलग-अलग स्थानों पर यादृच्छिक रूप से सामान डाल सकता है। क्या आप यही करने की कोशिश कर रहे थे? –

+0

@Euro Micelli:> संकलक बेतरतीब ढंग से सामान प्रत्येक निर्माण पर विभिन्न स्थानों में डाल सकता है <यही कारण है कि आपदा के लिए एक नुस्खा की तरह मेरे लिए लग रहा है। मैंने अभ्यास में ऐसी कोई चीज़ कभी नहीं देखी है। यह ऐसा कुछ है जो केवल माइक्रोसॉफ्ट टूल्स का उपयोग करता है? या .NET? प्रत्येक उदाहरण में जिसमें मैंने अनुभव किया है, संकलक हमेशा दिए गए इनपुट से सटीक उसी बिट-बिट-बिट परिणाम उत्पन्न करेगा। और कुछ अत्यधिक संदिग्ध होगा (आप कह सकते हैं "unreproducible निर्माण" ??) –

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