2011-09-27 16 views
51

VS2010 में लिंकर के तहत व्यय/DLLs के लिए डिबग जानकारी उत्पन्न करने के लिए एक विकल्प है, लेकिन libs के लिए लाइब्रेरियन तहत इस तरह के कोई विकल्प नहीं है। स्थिर पुस्तकालय में एम्बेडेड डीबग जानकारी है?स्टेटिक पुस्तकालय डिबग प्रतीकों

वहाँ C/C++ के लिए libs, व्यय, और DLLs के लिए कार्यक्रम डाटाबेस फ़ाइल नाम संपत्तियों में एक विकल्प है। डिफ़ॉल्ट रूप से यह मेरी इंटरमीडिएट निर्देशिका में जाता है और इसे libs के लिए प्रोजेक्ट नाम नाम दिया जाता है, लेकिन इसे vc $ (PlatformToolsetVersion) नाम दिया गया है। Pdb exes/dlls के लिए। इस विकल्प से पीडीबी क्या है और यह लिंकर विकल्प में पीडीबी से अलग कैसे है?

यदि मैं libs और हेडर के साथ लाइब्रेरी की आपूर्ति कर रहा हूं, तो मैं अपनी लाइब्रेरी के उपयोगकर्ता को डीबग प्रतीकों की आपूर्ति कैसे करूं?

उत्तर

42

तो आप का उपयोग /ZI या /Zi (C/C++ ->General ->Debug Information Format), तो vc$(PlatformToolsetVersion).pdb, बनाई गई है जो बनाया .obj फ़ाइलों के सभी के लिए डिबग जानकारी शामिल है। यदि वैकल्पिक रूप से आप /Z7 का उपयोग करते हैं, तो डीबग जानकारी .obj फ़ाइल में एम्बेड की जाएगी, और उसके बाद .lib में एम्बेड की जाएगी। यह शायद स्थैतिक पुस्तकालय के लिए डीबग जानकारी वितरित करने का सबसे आसान तरीका है।

मैं के बाद से यह आम तौर पर संकलक के विशेष संस्करण से जुड़ा हुआ है एक स्थिर पुस्तकालय वितरण सलाह नहीं हैं, फिर भी,।

+0

आप डीएलएल के साथ भी/Z7 का उपयोग कर सकते हैं? इसके अलावा, 'डेबफ सूचना प्रारूप' और पूर्व/डीएलएस के लिए 'प्रोग्राम डेटाबेस फ़ाइल जेनरेट करें' के बीच क्या अंतर है - प्रत्येक पीडीबी का अलग-अलग उत्पादन करता है और मैंने पहले ही 'प्रोग्राम प्रोग्राम फ़ाइल जेनरेट' से पहले ही इसकी देखभाल की है। – David

+1

/Z7 कंपाइलर के लिए एक तर्क है। आप इसे किसी भी कोड फ़ाइल के साथ उपयोग कर सकते हैं, भले ही .obj फ़ाइल को .exe या .dll से जोड़ा जाएगा या नहीं। आपको लिंक समय पर .exe/.dll के लिए .pdb का उत्पादन करने में सक्षम होने के लिए संकलन समय से डीबगिंग जानकारी की आवश्यकता है।/Z7 इसे .obj फ़ाइल में स्वयं रखने के लिए कहता है, जबकि डिफ़ॉल्ट व्यवहार इसे vc $ (संस्करण) .pdb में रखना है। – mloar

+2

यह किसी कारण से वीएस 2013 के साथ मेरे लिए काम नहीं कर रहा है। वीएस .lib फ़ाइल स्रोतों के लिए डीबग जानकारी लोड करने में विफल रहा है। मेरे पास .lib और .exe प्रोजेक्ट्स दोनों के लिए/Z7 है, और/.ee प्रोजेक्ट लिंक विकल्पों में डीबग करें। –

7

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

यदि उनका उपयोग करने वाला प्रोग्राम डीबग प्रतीकों का उपयोग कर रहा है, तो उस प्रोग्राम में संकलित लाइब्रेरी कोड में प्रतीक भी होंगे। विकिपीडिया से

PDB जानकारी:

डिबग प्रतीकों ही द्विआधारी में एम्बेडेड रहे हैं, फ़ाइल तो (कई मेगाबाइट से कभी कभी) बढ़ सकता है काफी बड़ा। इस अतिरिक्त आकार से बचें, आधुनिक कंपाइलर्स और प्रारंभिक मेनफ्रेम डीबगिंग सिस्टम प्रतीकात्मक जानकारी को एक अलग फ़ाइल में आउटपुट करते हैं; माइक्रोसॉफ्ट कंपाइलर्स के लिए, इस फ़ाइल को पीडीबी फ़ाइल कहा जाता है।

+2

यही वह है जो मुझे लगता है कि ऐसा होने वाला माना जाता है लेकिन यह केवल झूठा लगता है। मुझे वीएस चेतावनियां मिली हैं कि स्थिर पुस्तकालयों को जोड़ने पर पीडीबी नहीं मिल सकते हैं। इसके अलावा, exes/dlls के लिए वीएस 2 पीडीबी पैदा करता है; मुझे नहीं पता कि इंटरमीडिएट डीआईआर में प्रतीत होता है कि अर्थहीन एक है लेकिन यह केवल ** ** ** स्थिर लिबियों के लिए उत्पादित है, और exes/dlls के मुकाबले एक अलग नाम के रूप में है। – David

+4

स्थैतिक libs (इंटरमीडिएट डीआईआर में) के लिए उत्पादित एकमात्र पीडीबी डीबग जानकारी है जब आप इस स्थिर lib के साथ अपने डीएल/एक्सई को लिंक करते हैं। यदि आप एक ही मशीन पर अपने सभी स्थिर libs और अपने dll/exe दोनों का निर्माण करते हैं और निर्माण के बाद निर्देशिका को स्थानांतरित नहीं करते हैं, तो इन पीडीबी पूरी तरह से पाए जाते हैं और डीबग जानकारी exes/dlls में शामिल होती है। यदि आप निर्देशिका चलाते हैं, या किसी अन्य मशीन पर स्थैतिक libs बनाते हैं, तो VS स्थिर पुस्तकालयों के लिए पीडीबी खोजने में विफल रहता है और चेतावनियां उत्पन्न करता है। – vond

14

मैं VS2013 में यह C/C++ आउटपुट फ़ाइलें टैब में प्रोग्राम डेटाबेस फ़ाइल नाम सेट करना संभव है पर ध्यान दें। इसे डिफ़ॉल्ट रूप से $ (आउटडियर) $ (TargetName) .pdb समस्या को हल करता है

+0

चौथे अपडेट से शुरू VS2012 में वही – Maxym

1

वीएस2012 में अजीब व्यवहार। स्क्रैच से बिल्डिंग (या एनएमके में/ए विकल्प के साथ) एक .pdb फ़ाइल का उत्पादन करेगा। अब .lib और .pdb को हटाएं और nmake को पुन: चालू करें (बेशक बिना ए/ए, केवल लिंक चलाने के लिए) और कोई .pdb फ़ाइल आउटपुट नहीं है।

28

पिछले जवाब पर विस्तार करते हुए, जो उन लोगों के पूर्ण कैसे-करने की आवश्यकता के लिए (वी.एस. 2013)।

ध्यान दें कि यह VS2013 मुद्दों के बारे में ऊपर टिप्पणियों पर ध्यान देना चाहिए ^^।

विधि 1: कार्यक्रम डेटाबेस (।pdb) वे (/ जि या/जि)

  1. स्टेटिक लिब परियोजना: View मेनू से

    • ओपन Solution Explorer: अपने स्थिर lib रूप में एक ही नाम के साथ एक pdb उत्पन्न करें।
    • अधिकार अपने स्थिर lib परियोजना क्लिक करें, Properties
    • संपादित Configuration Properties ->C/C++ ->General ->Debug Information करने के लिए /Zi या /ZI
      • ध्यान दें कि /ZI की अनुमति देता है "संपादित करें और आगे बढ़ें"
      डिबगिंग के दौरान संपादन
    • संपादित करें Configuration Properties ->C/C++ ->Output Files ->Program Database File Name से $(OutDir)$(TargetName).pdb
    • अब इसे संकलित करें, और ध्यान दें कि YourLib.lib और YourLib.pdb कहां हैं।
  2. आवेदन परियोजना:, अपने आवेदन परियोजना के लिए

  3. फिर

    • फिर, गुण परियोजना के लिए नेविगेट, लेकिन इस बार: स्थिर lib, और नए PDB फ़ाइल के साथ अपने निष्पादन लिंक , आवश्यकतानुसार Debug Information संपत्ति संपादित करें।
    • संपादित Configuration Properties ->Linker ->General ->Additional Library Directories, अपने खुद के "libs" निर्देशिका, या जो कुछ भी निर्देशिका आप रखना/अपने YourLib.lib और YourLib.pdb फ़ाइलों की प्रतिलिपि करने की योजना को जोड़ने।
    • संपादित Configuration Properties ->Linker ->Input ->Additional Dependencies, YourLib.lib (सामने कोई रास्ता)
    • अब दोनों YourLib.lib और YourLib.pdb कॉपी निर्देशिका आप ऊपर निर्दिष्ट करने के लिए जोड़ने।

विधि 2: एंबेडेड चिह्न (कोई .pdb) वे (/ Z7)

  1. स्टेटिक लिब परियोजना: एम्बेडेड डिबग प्रतीकों के साथ एक स्थिर lib उत्पन्न

    • विधि 1 में, प्रोजेक्ट गुणों पर नेविगेट करें
    • विधि 1 में
    • के रूप में, संशोधित अपने Debug Information, लेकिन /Z7
    • इस बार विधि 1 में के रूप में, संकलन और ध्यान दें जहां YourLib.lib उत्पन्न होता है।
  2. आवेदन परियोजना: लिंक आप स्थिर lib

    • विधि 1 में के रूप में के साथ निष्पादन योग्य, गुण
    • विधि 1 में के रूप में पेश करने की नेविगेट करें, अपना Debug Information संपत्ति के रूप में की जरूरत
    • संशोधित
    • विधि 1 में, Additional Library Directories
    • विधि 1 में, Additional Dependencies
    • संपादित करें
    • अब निर्देशिका में Additional Library Directories

चर्चा निर्दिष्ट करने के लिए YourLib.lib कॉपी: Z7 की

  • लाभ? यह आसान है, और इसे करने का "एकल-फ़ाइल" तरीका है। सभी डीबग जानकारी lib फ़ाइल में है।
  • Z7 के नुकसान? डिस्क पर, लिंक बार फ़ाइल का आकार, "कम से कम के पुनर्निर्माण" के साथ असंगत (/ ग्राम) सुविधा, "संपादित करें और आगे बढ़ें" की अनुमति नहीं है, पुराने स्वरूप (जैसे पुराने प्रतिमान)
  • मैं क्यों निर्दिष्ट नहीं करते Debug Information आवेदन परियोजना के लिए सेटिंग? यह पोस्ट इस बात से संबंधित है कि स्थैतिक lib कोड में डीबग कैसे प्राप्त करें। वही "विधि 1 बनाम विधि 2" विकल्प भी एप्लिकेशन प्रोजेक्ट के लिए लागू होता है।
संबंधित मुद्दे

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