2008-09-16 3 views
5

लिनक्स/जीसीसी/एलडी - टूलचेन।सी ++ - एसटीएल/बूस्ट डीबग प्रतीकों को हटाएं (... या उन्हें न बनाएं)

मैं दो कारणों से, पुस्तकालयों और निष्पादन से STL/बढ़ावा डिबग प्रतीकों निकालना चाहते हैं:

  1. लिंकिंग बड़ा कार्यक्रमों
  2. डिबगिंग STL/बढ़ावा कोड है, जो कष्टप्रद है में कूदता के लिए बहुत धीमी गति से हो जाता है

1. वृद्धिशील लिंकिंग एक बड़ा सुधार होगा, लेकिन AFAIK एलडी वृद्धिशील लिंकिंग का समर्थन नहीं करता है। 1 999 के डॉ। डॉबब के जर्नल (वेब ​​पर नहीं, बल्कि archive.org पर एक कामकाज "छद्म वृद्धिशील लिंकिंग" है (विचार यह है कि सबकुछ गतिशील पुस्तकालय में और सभी अद्यतन ऑब्जेक्ट फ़ाइलों को लोड किया गया है जो लोड किया गया है पहला) लेकिन यह वास्तव में एक सामान्य समाधान नहीं है।

के लिए 2. एक स्क्रिप्ट here है, लेकिन ए) यह मेरे लिए काम नहीं करता है (यह प्रतीकों को नहीं हटाता है), बी) यह बहुत धीमा है क्योंकि यह काम करता है पाइप के अंत में, जबकि यह पहले प्रतीकों को हटाने के लिए और अधिक कुशल होगा।

जाहिर है, अन्य डिबग प्रतीकों जगह में रहना चाहिए।

उत्तर

-1

आप किस कंपाइलर का उपयोग कर रहे हैं? उदाहरण के लिए, यदि मैं आपके प्रश्न को सही ढंग से समझता हूं, तो यह एमएस विजुअल स्टूडियो में एक मामूली मामला है।

+0

मदद करता है तो उसे बताएं कि यह कैसे करें। – gbjbaanb

+0

यह मामूली हो सकता है, लेकिन यह बहुत अधिक टाइपिंग है ... बाहर निकलता है कि वह वीएस में नहीं है। – hatcat

1

आप शायद साझा पुस्तकालयों से डिबग प्रतीकों पट्टी, जैसा कि आप कुछ बिंदु पर है कि आवश्यकता हो सकती है नहीं करना चाहती।

यदि आप डीबग करने के लिए जीडीबी या डीडीडी का उपयोग कर रहे हैं, तो आप स्रोत पथ से बूस्ट स्रोत फ़ाइलों को हटाने में सक्षम हो सकते हैं ताकि यह फ़ंक्शंस में ट्रेस न हो। (या बस उन्हें में पता लगाने के नहीं है, से अधिक का पता लगाने!)

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

स्क्रिप्ट आप लिंक की तरह, आप पट्टी कार्यक्रम ("आदमी पट्टी") सभी या कुछ प्रतीकों को दूर करने से परामर्श कर सकते हैं।

1

आप स्ट्रिप का उपयोग करना चाह सकते हैं। स्ट्रिप - स्ट्रिप-अनइडेड - स्ट्रिप-डीबग libfoo.so

हालांकि आप पहली जगह में डिबगिंग के बिना क्यों नहीं बनाते?

2

जहां तक ​​मुझे पता है कि जीसीसी में आप जो चाहते हैं उसे करने का कोई वास्तविक विकल्प नहीं है। मुख्य समस्या यह है कि सभी कोड जिन्हें आप डिबग प्रतीकों को पट्टी करना चाहते हैं, शीर्षकों में परिभाषित किया गया है।

Otherwhise यह एक पुस्तकालय separatly का निर्माण संभव हो सकता है, पट्टी, और छीन संस्करण के साथ लिंक।

लेकिन केवल एक संकलन इकाई के कुछ भागों से डिबग प्रतीकों हो रही है, जबकि निर्माण और (अपने वांछित लिंक समय speedup के लिए) को जोड़ने नहीं जीसीसी में संभव के रूप में तक मुझे पता है है।

3

जीएनयू स्ट्रिप regex तर्कों को स्वीकार करता है - स्ट्रिप-प्रतीकों = एसटीएल और बूस्ट प्रतीकों को नामस्थानों के नाम से नामांकित किया जाता है।मेरे पास इस पल में जीसीसी बिनुटिल्स काम नहीं करते हैं, लेकिन नामस्थानों के लिए इस्तेमाल किए गए मैंगलिंग नाम पर नजर डालें और 'नेमस्पेस एक्स' के प्रतीकों के लिए रेगेक्स बनाएं और इसे पास करें- स्ट्रिप-प्रतीकों =

+0

इससे ज्यादा मदद नहीं मिलती है। टेम्पलेट्स से उत्पन्न सभी कार्यों को अपने स्वयं के प्रतीक नहीं मिलते हैं। इसे एक साधारण प्रोग्राम के साथ आज़माएं जो std :: vector का उपयोग करता है। –

+0

@ एन.एम .: यह मानते हुए कि प्रश्न _removing_ प्रतीकों के बारे में है, मुझे लगता है कि उन कार्यों पर विचार करने का कोई कारण नहीं है जो शुरू करने के प्रतीक नहीं बन गए हैं! – MSalters

+0

क्षमा करें, मेरा मतलब सिर्फ डीबगिंग के बारे में प्रश्न का दूसरा भाग है। स्ट्रिपिंग प्रतीक जीडीबी को फंक्शंस में जाने से नहीं रोकेगा जिसमें पहले स्थान पर प्रतीक नहीं हैं! –

1

यह उत्तर प्रदान करता है कुछ विनिर्देश जिन्हें मुझे एसएसएल प्रतीकों को हटाने के लिए एमएसल्टर्स के उत्तर कार्य को करने की आवश्यकता थी।

एसटीएल प्रतीक नाम उलझन में हैं। यह चाल एक नियमित अभिव्यक्ति को ढूंढना है जो इन नामों को कवर करती है। मैं इन प्रतीकों जीएनयू के binutils साथ देखा:

> nm --debug-syms <objectfile> 

मैं मूल रूप से एसटीएल कार्यों पर खोज की, resize की तरह। यदि यह मुश्किल है, उत्पादन पठनीय जब निम्न आदेश का उपयोग हो जाता है:

> nm --debug-syms --demangle <objectfile> 

एक एसटीएल समारोह कॉल रखने वाली पंक्ति संख्या देखें, फिर देखो यह है कि एक ही लाइन पहले आदेश का प्रयोग करके नंबर पर घायल नाम है। यह मैं देखने की अनुमति दी है कि सभी एसटीएल प्रतीक नाम _ZNSt [0-9] + या _ZSt [0-9] +, आदि

के साथ शुरू हुआ जीएनयू पट्टी अनुमति देने के लिए इन प्रतीकों मैं इस्तेमाल किया दूर करने के लिए:

> strip --wildcard    \ 
    --strip-symbol='_ZNKSt*' \ 
    --strip-symbol='_ZNSt*'  \ 
    --strip-symbol='_ZSt*'  \ 
    --strip-symbol='_ZNSa*'  \ 
    <objectfile> 

मैंने इन आदेशों का सीधे संकलित/लिंक बाइनरी पर उपयोग किया। मैंने हटाए जाने से पहले और बाद में nm के आउटपुट की तुलना करके इन प्रतीकों को हटाने की पुष्टि की (मैंने फ़ाइलों को आउटपुट लिखा और vimdiff का उपयोग किया)। --wildcard विकल्प नियमित अभिव्यक्तियों के उपयोग की अनुमति देता है। हालांकि मैं [0-9] * की असीमित संख्या के लिए 0 का अनुमान लगाने की अपेक्षा करता हूं, यहां वास्तव में इसका मतलब है कि 1 नंबर के बाद किसी भी प्रकार की अनंत राशि (रेखा के अंत तक) होती है।

आप करने के लिए देख रहे हैं, तो के रूप में here किया एसटीएल कोड इस gdb के skip file कमांड द्वारा प्राप्त किया जा सकता में कदम नहीं,।

आशा है कि यह

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