.Pdb फ़ाइलों को जनरेट करना जारी करें, क्यों?


264

.pdbरिलीज में संकलन करते समय विजुअल स्टूडियो 2005 फाइलें क्यों उत्पन्न करता है ? मैं एक रिलीज़ बिल्ड डिबगिंग नहीं करूंगा, इसलिए वे क्यों उत्पन्न होते हैं?


18
Realb में pdb क्यों जनरेट करें? तो जब एक दुर्घटना रिपोर्ट जंगली से आती है तो आपको इसे डीबग करने की जानकारी होती है। अन्य मूल्य यह है कि ग्राहक मूल लेखक नहीं होने पर इसे डीबग कर सकते हैं।
इयान बॉड

@IanBoyd: उस टिप्पणी का दूसरा वाक्य तात्पर्य है, कि आप PDB की तैनाती करते हैं। यह अधिकांश मामलों में वांछनीय नहीं है।
IInspectable


@IanBoyd: अधिकांश मामलों में OS परिनियोजन शामिल नहीं है। इसके अलावा, उन पीडीबी में निजी प्रतीक नहीं होते हैं, जो डिफ़ॉल्ट रूप से शामिल होते हैं, जब आप पीडीबी उत्पन्न करते हैं।
IInspectable

@IInspectable दूसरी ओर, PBDs जारी करना वांछनीय है। आदर्श रूप से, हां, हर कोई आईएल के लिए संकलित कोड लिखेगा, ताकि हम खुद को प्रतीक की जानकारी प्राप्त कर सकें। लेकिन देशी कोड कंपाइलरों के पास अभी भी क्षेत्र में डिबगिंग का समर्थन करने का कोई आसान तरीका नहीं है।
इयान बॉयड

जवाबों:


416

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

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

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

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

  3. प्रोफाइलिंग को हमेशा "रिलीज" पर किया जाना चाहिए, जो अनुकूलन योग्य है। और एक बार फिर, पीडीबी फाइलें काम में आती हैं, क्योंकि वे असेंबली निर्देशों को प्रोफाइल कोड में मैप करने की अनुमति देती हैं जो आपने वास्तव में लिखा था।

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

यदि आप वास्तव में उन्हें बंद करना चाहते हैं, तो यह हमेशा एक विकल्प है। अपने प्रोजेक्ट की प्रॉपर्टीज़ विंडो में, जिस भी कॉन्फ़िगरेशन को आप बदलना चाहते हैं, उसके लिए "डीबग इन्फो" विकल्प को "कोई नहीं" पर सेट करें।

टिप्पणी करते हैं, तथापि, कि "डीबग" और "रिलीज़" विन्यास करना डिबग जानकारी उत्सर्जन के लिए डिफ़ॉल्ट उपयोग अलग-अलग सेटिंग से। आप इस सेटिंग को रखना चाहेंगे। डीबग बिल्ड के लिए "डीबग इन्फो" विकल्प "पूर्ण" पर सेट है, जिसका अर्थ है कि पीडीबी फ़ाइल के अलावा, डिबगिंग प्रतीक जानकारी विधानसभा में एम्बेडेड है। आपको ऐसे प्रतीक भी मिलते हैं जो संपादन और जारी रखने जैसी शांत सुविधाओं का समर्थन करते हैं। रिलीज़ मोड में, "pdb-only" विकल्प का चयन किया जाता है, जो ऐसा लगता है, जिसमें विधानसभा की सामग्री को प्रभावित किए बिना केवल पीडीबी फ़ाइल शामिल है। तो यह आपकी /binनिर्देशिका में पीडीबी फ़ाइलों की उपस्थिति या अनुपस्थिति के रूप में काफी सरल नहीं है । लेकिन मान लें कि आप "पीडीबी-ओनली" विकल्प का उपयोग करते हैं, तो पीडीबी फाइल '

* जैसा कि मार्क शर्मन एक टिप्पणी में बताते हैं , जब तक कि आपका स्रोत कोड नहीं बदला है (या आप संस्करण-नियंत्रण प्रणाली से मूल कोड को पुनः प्राप्त कर सकते हैं), आप इसे फिर से बना सकते हैं और एक मिलान पीडीबी फ़ाइल उत्पन्न कर सकते हैं। कम से कम, आमतौर पर। यह ज्यादातर समय अच्छी तरह से काम करता है, लेकिन जब आप समान कोड संकलित करते हैं तो हर बार समान बायनेरिज़ बनाने के लिए कंपाइलर की गारंटी नहीं होती है , इसलिए सूक्ष्म अंतर हो सकते हैं। इससे भी बदतर, अगर आपने इस बीच अपने टूलकिन में कोई अपग्रेड किया है (जैसे विजुअल स्टूडियो के लिए सर्विस पैक लागू करना), तो पीडीबी के मैच होने की संभावना कम है। की विश्वसनीय पीढ़ी की गारंटी के लिएपूर्व postfactoपीडीबी फाइलें, आपको अपने संस्करण-नियंत्रण प्रणाली में न केवल स्रोत कोड को संग्रहीत करने की आवश्यकता होगी, बल्कि आपके पूरे बिल्ड टूलचैन के लिए बायनेरिज़ भी सुनिश्चित करने के लिए कि आप अपने बिल्ड वातावरण के कॉन्फ़िगरेशन को फिर से बना सकते हैं। यह बिना कहे चला जाता है कि पीडीबी फाइलों को केवल बनाना और संग्रह करना बहुत आसान है।


19
"आप संकलन के बाद PDB फ़ाइलों को उत्पन्न नहीं कर सकते।" - यदि आपका स्रोत कोड नहीं बदला है तो आप इस तथ्य के बाद एक प्रयोग करने योग्य पीडीबी बनाने के लिए पुनर्निर्माण कर सकते हैं। डिफ़ॉल्ट रूप से, windbg इस PDB को लोड नहीं करेगा, लेकिन आप इसे इस तरह / i विकल्प निर्दिष्ट करके लोड करने के लिए बाध्य कर सकते हैं .reload /i foo.dll। यह foo.pdb को लोड करेगा भले ही foo.pdb को foo.dll जारी करने के बाद बनाया गया हो।
मार्क शेरमैन

मैंने देखा कि प्रत्येक नए संकलन में अलग-अलग हैश डाइजेस्ट होते हैं, इसलिए समान वातावरण में भी प्रत्येक बिल्ड के साथ मामूली परिवर्तन होते हैं। क्या PDB के लिए पते विचरण के साथ नहीं बदल सकते हैं, इसलिए उस बिल्ड से PDB को रखने की आवश्यकता है? बस इसे एक विचार के रूप में डाल रहा हूं क्योंकि मैं वास्तव में यह नहीं समझता कि पीडीबी कैसे काम करता है या बिल्ड के बीच हैश क्यों बदलता है।
thebunnyrules

1
@ फुट फुटनोट में, मैंने एक लेख से यह समझाते हुए कहा कि "डिज़ाइन द्वारा C # कंपाइलर कभी भी एक ही बाइनरी को दो बार नहीं बनाता है। C # कंपाइलर हर विधानसभा में एक नए सिरे से जेनरेट किया गया GUID एम्बेड करता है, हर बार जब आप इसे चलाते हैं, तो यह सुनिश्चित करता है कि कोई भी दो असेंबली न हों।" कभी बिट-फॉर-बिट समान हैं। " यह बताता है कि क्यों यह एक अलग हैश है, और इसलिए एक अलग पीडीबी फ़ाइल। यह एक हेक्स संपादक के साथ ठीक है, लेकिन उपयोगकर्ता के अनुकूल नहीं है। और इस उत्तर के दायरे से बाहर भी।
कोड़ी ग्रे

3
रोसलिन में एक नई सुविधा है जिसे नियतात्मक बिल्ड कहा जाता है। "/ नियतात्मक ध्वज कंपाइलर को उसी इनपुट के कारण सटीक EXE / DLL, बाइट के लिए बाइट का उत्सर्जन करने का कारण बनता है।" इसका मतलब यह है कि यह परियोजना मूल रूप से इस ध्वज के साथ संकलित की गई है, इसे उसी बाइनरी के लिए पुन: संयोजित किया जा सकता है, जब तक कि आप जो कोड संकलित कर रहे हैं वह समान है। रोजलिन
के स्मिथ

92

पीडीबी के लिए और Releaseसाथ ही उत्पन्न किया जा सकता है Debug। यह (VS2010 में लेकिन VS2005 में समान होना चाहिए) पर सेट है:

प्रोजेक्ट → गुण → बिल्ड → एडवांस → डीबग इन्फो

बस इसे बदल दो None


2
लेकिन आप ऐसा क्यों करेंगे? यदि आपका सॉफ़्टवेयर रिलीज़ के लिए तैयार है तो आपको तब तक अपना सभी डिबगिंग कर लेना चाहिए
m.edmondson

4
क्योंकि आप उत्पादन के मुद्दों को डीबग कर सकते हैं। एक बार हमें यह करना था।
अलीओस्ताद

21
उत्पादन कोड के लिए PDB के शीर्षक का लाभ यह है कि .NET अपवादों को फेंकने पर इन फ़ाइलों का उपयोग करेगा। यह फ़ाइल नामों और लाइन नंबरों के साथ स्टैक निशान उत्पन्न करता है, जो अक्सर बहुत काम आता है!
स्टीवन

6
@ m.edmondson: हाँ, यह सही है। आपको अभी भी सूचित किया जाएगा कि फेंका गया अपवाद क्या था (जैसे FileNotFoundException), लेकिन आप स्टैक ट्रेस नहीं देख पाएंगे। इससे यह पता लगाना बहुत मुश्किल हो जाता है कि कोड की किस लाइन के कारण अपवाद को फेंका गया था।
कोड़ी ग्रे

2
@ m.edmondson बस जोड़ने के लिए अगर आप अपने उत्पादन बक्से में से किसी एक मुद्दे को दूरस्थ रूप से डीबग करने के लिए एक टूल की तलाश कर रहे हैं, तो विंडोज़ एसडीके एक बहुत प्रसिद्ध उपकरण के साथ आता है जिसे विनबग कहा जाता है जो दूरस्थ डीबगिंग का समर्थन करता है। कृपया नीचे दिए गए लिंक पर एक नज़र डालें। उम्मीद है की यह मदद करेगा! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT

8

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


7

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


5
@ m.edmondson RDP, Webex इत्यादि का उपयोग करके दूरस्थ मशीन तक पहुँच प्राप्त करें और वहाँ windbg स्थापित करें। अपने प्रतीकों पथ और बेम सेट करें, आप सुनहरे हैं!
मार्क शर्मन

अधिक विस्तृत गाइड का लिंक अधिक मददगार होता। यह एक-लाइन कैसे-कैसे लोगों (अपने जैसे) को गलत रास्ते पर ले जा सकती है। अधिकांश .NET देवों को उदाहरण के लिए Windbg के बारे में कुछ नहीं पता होगा।
nuzzolilo

1
@ m.edmondson - विजुअल स्टूडियो के कुछ संस्करणों में दूरस्थ डिबगिंग करने की क्षमता है। डिबग मेनू से आप रिमोट मशीन पर "प्रक्रिया के लिए संलग्न" करते हैं।
मैथ्यू

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

4

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


2

.PDB फ़ाइल "प्रोग्राम डेटाबेस" का संक्षिप्त नाम है। इसमें डीबगर और संसाधनों के लिए डिबग बिंदु के बारे में जानकारी है जो उपयोग या संदर्भ के लिए है। यह तब उत्पन्न होता है जब हम डिबग मोड के रूप में निर्माण करते हैं। इसके रनटाइम में डिबग के लिए आवेदन करने की अनुमति है।

आकार डीबग मोड में .PDB फ़ाइल की वृद्धि है। इसका उपयोग तब किया जाता है जब हम अपने आवेदन का परीक्षण कर रहे होते हैं।

Pdb फ़ाइल का अच्छा लेख।

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P


1
"किसी को रिलीज़ होने पर या रिलीज़ होने पर इस फ़ाइल की कोई ज़रूरत नहीं है" जब कोई उस रिलीज़ किए गए संस्करण में किसी क्रैश का अनुभव करता है, और क्रैश रिपोर्ट आपको उनसे प्राप्त होती है जिसमें एक प्रयोग करने योग्य स्टैक ट्रेस नहीं होता है ... तो आप चाहते हैं कि आप इसे शामिल कर लें। सब।
Nyerguds

सच नहीं। .Pdb फ़ाइलों के बिना आपको पूर्ण स्टैकट्रेस मिलेगी, लेकिन स्रोत फ़ाइलों के नाम के बिना। क्रैश रिपोर्ट प्राप्त करने के बाद आप इसे घर में पुनर्प्राप्त कर सकते हैं। यदि आप अपने बौद्धिक अधिकारों और स्रोतों को बाधित करने के बारे में परवाह करते हैं, तो आपको .pdb फ़ाइलों को सहेजना होगा, लेकिन उन्हें तैनात करने के लिए नहीं।
टॉप KEK

1

एक बहु-परियोजना समाधान में, आप आमतौर पर एक कॉन्फ़िगरेशन लेना चाहते हैं जो बिना पीडीबी या एक्सएमएल फ़ाइलों को बिल्कुल उत्पन्न करता है। Debug Infoहर प्रोजेक्ट की संपत्ति को बदलने के बजाय none, मैंने सोचा कि पोस्ट-बिल्ड इवेंट को जोड़ना अधिक समीचीन होगा जो केवल एक विशिष्ट कॉन्फ़िगरेशन में काम करता है।

दुर्भाग्य से, विज़ुअल स्टूडियो आपको अलग-अलग कॉन्फ़िगरेशन के लिए अलग-अलग पोस्ट-बिल्ड इवेंट निर्दिष्ट करने की अनुमति नहीं देता है। इसलिए मैंने csprojस्टार्टअप प्रोजेक्ट की फाइल को एडिट करके और निम्नलिखित को जोड़कर (किसी मौजूदा PostBuildEventटैग के बजाय ) मैन्युअल रूप से ऐसा करने का फैसला किया :

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

दुर्भाग्य से, यह पोस्ट बिल्ड ईवेंट टेक्स्टबॉक्स को खाली कर देगा और इसमें कुछ भी डालने पर अप्रत्याशित परिणाम हो सकते हैं।


4
यह सभी *.xmlफ़ाइलों को हटा देगा , इससे सावधान रहें।
मारियस जमरो

0

डीबग प्रतीक ( .pdb) और XML डॉक्स ( .xml) फ़ाइलें कुल आकार का एक बड़ा प्रतिशत बनाती हैं और इन्हें नियमित परिनियोजन पैकेज का हिस्सा नहीं होना चाहिए। लेकिन अगर उन्हें जरूरत हो तो उन्हें एक्सेस करना संभव है।

एक संभावित दृष्टिकोण: टीएफएस निर्माण प्रक्रिया के अंत में, उन्हें एक अलग विरूपण साक्ष्य में स्थानांतरित करें।


-1

वास्तव में पीडीबी फाइलें और प्रतीकात्मक जानकारी के बिना उनके पास एक सफल क्रैश रिपोर्ट (मेमोरी डंप फाइलें) बनाना असंभव होगा और Microsoft के पास पूरी तस्वीर नहीं होगी जो समस्या का कारण बने।

और इसलिए PDB होने से क्रैश रिपोर्टिंग में सुधार होता है।


लेकिन क्या वास्तव में .pdb फ़ाइलों के बिना गायब हो जाएगा?
शीर्ष KEK

आप संकलन के बाद PDB फ़ाइलों को उत्पन्न नहीं कर सकते। इसलिए सॉफ़्टवेयर का हर संस्करण मेजर। मिनर [.build [.revision]] को ठीक से समझने के लिए Microsoft पर सहेजा जाना चाहिए था कि क्या हुआ, लेकिन यह सब नहीं है।
प्रोस्टी

प्रत्येक बार समान कोड को संकलित करने के लिए कंपाइलर समान बायनेरिज़ बनाने की गारंटी नहीं है।
प्रोस्टि

सवाल यह था कि क्रैश रिपोर्ट में क्या गायब होगा और क्रैश रिपोर्टिंग कैसे प्रभावित होगी। .NET pdb फ़ाइलों में केवल निजी चर नाम और स्रोत फ़ाइलें नाम होते हैं। अन्य सभी (विधियों के नाम, हस्ताक्षर आदि) मेटाडेटा जानकारी से स्टैकट्रेस में होंगे।
टॉप KEK

कोई भी PDB फ़ाइलों में गैर निजी डेटा नहीं होता है: github.com/microsoft/microsoft-pdb
प्रोस्टि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.