2015-03-10 11 views
6

मेरे पास एक प्रक्रिया का एक coredump है जो क्रैश हो गया है (पुन: उत्पन्न करने में कठोर)।स्थानीय चर की जांच फ़ंक्शन

मुझे पता चला है कि फ़ंक्शन में कुछ गलत हो गया है जो अभी लौटा है (यह एक गैर-पॉइंटर के बजाय एक नल पॉइंटर लौटाया गया है)।

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

क्या कोई मेरी पुष्टि की पुष्टि कर सकता है कि सही है और शायद एक उदाहरण प्रदान करें कि यह gdb के साथ कैसे करें?

क्या मेरा तर्क एमआईपीएस के लिए भी है?

+1

जीबीआई में 'मदद x' आज़माएं। – alk

उत्तर

4

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

प्रश्न में फ़ंक्शन को अलग करें (आप ऐसा करने के लिए objdump -dS का उपयोग कर सकते हैं, ताकि आप स्रोत को आसानी से सहसंबंधित कर सकें)। देखें कि स्थानीय चर कैसे पहुंचे थे। क्या वे स्मृति या रजिस्टरों में संग्रहीत थे? क्या पंजीयक पहले से ही कॉलर के लिए प्रासंगिक उनके मूल्य पर बहाल किए गए थे?

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

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

बुलाए गए फ़ंक्शन के आधार पर, आप इसके तर्कों (जब कॉल किए जाते हैं) की जांच करने और स्थानीय चर के मान को पुन: गणना करने में सक्षम भी हो सकते हैं।

0

आप स्थानीय चर है कि का उपयोग नहीं कर अनुकूलित किया जाना देख सकते हैं:

info locals 

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

अन्यथा, आप स्टैक पॉइंटर पते को जानने के लिए x/x और info register का उपयोग करके स्टैक की मैन्युअल रूप से जांच कर सकते हैं।

फिर आप up और down का उपयोग करके स्टैक ब्राउज़ कर सकते हैं।

+0

यदि फ़ंक्शन पहले से ही बाहर निकला है, तो स्थानीय लोग अब ढेर पर नहीं हैं। – urzeit

+0

ओह, यह वापस आ गया है। उस पर ध्यान नहीं दिया। – blue112

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