2011-05-11 11 views
6

मुझे पता है कि आप gdb का उपयोग कर एक सकारात्मक $ ईबीपी से ऑफसेट को देखकर कोई पैरामीटर पा सकते हैं: फिरजीडीबी के साथ स्थानीय चर कैसे पढ़ा जाए?

(gdb) x/4wx $ebp 

, मैं 3 और 4 के पते पर देखने x/s का उपयोग करेगा, क्योंकि वे पहले और दूसरे होगा पैरामीटर। स्थानीय चर के बारे में क्या? मैं $ ebp से ऋणात्मक ऑफ़सेट पर मानों को कैसे देखूं? इसके अलावा, क्या $ eax के मूल्य को देखने के लिए वैसे भी है? जब भी मैं x/s $eax का उपयोग कर $ eax के मूल्य को मुद्रित करने का प्रयास करता हूं, तो पता बाध्य है या मान 0 है, जो मुझे यकीन है कि ऐसा इसलिए नहीं है क्योंकि मैं केवल रजिस्टर में निरंतर मूल्य डालता हूं।

मैंने info locals की कोशिश की लेकिन मुझे संदेश "कोई प्रतीक तालिका जानकारी उपलब्ध नहीं है"।

उत्तर

6

सबसे पहले आपको अपने बाइनरी में प्रतीकों को डीबग करने की आवश्यकता है। ऐसा करने के लिए अपने वर्तमान कमांड के साथ जीसीसी पर -g विकल्प का प्रयोग करें। यदि आप एक अलग कंपाइलर का उपयोग कर रहे हैं तो आपको इसके दस्तावेज़ों से परामर्श करने की आवश्यकता होगी। इसके बाद, 'जानकारी स्थानीय' और प्रिंट कमांड काम करेगा।

किसी भी स्थानीय चर को देखने के लिए आपको केवल 'प्रिंट' कमांड का उपयोग करना है। उदाहरण के लिए स्थानीय चर 'i' को देखने के लिए यह 'प्रिंट i' जितना आसान है।

आपको $ ebp के रूप में $ eax को संभालने में सक्षम होना चाहिए। मुझे संदेह है कि आपको समस्याएं हैं क्योंकि आप एक्स/एस का उपयोग कर रहे हैं। x/s एक स्ट्रिंग को आज़माकर प्रिंट करेगा, और इसलिए यह तब तक जारी रहेगा जब तक यह एक शून्य चरित्र को हिट न करे। यदि यह लंबे समय तक नहीं होता है तो स्ट्रिंग की लंबाई सीमा से बाहर हो जाएगी। 'X/d $ eax' आज़माएं। आप 'प्रिंट $ eax' भी कर सकते हैं। आप सभी रजिस्टर डेटा प्राप्त करने के लिए 'जानकारी पंजीयक' का भी उपयोग कर सकते हैं।

0

मुझे पता है कि आप gdb

यह केवल काम करता है का उपयोग कर कुछ प्रोसेसर और कुछ बुला सम्मेलनों के लिए एक सकारात्मक $ ईबीपी से ऑफसेट को देखकर कोई पैरामीटर पा सकते हैं, और है कोई सार्वभौमिक तरह से।

मान लीजिए कि आप केवल x86 की देखभाल करते हैं, और यह कि आपका कोड फ्रेम पॉइंटर्स (जो डिफ़ॉल्ट होता था, लेकिन अब ऑप्ट मोड में जीसीसी 4.6 के लिए डिफ़ॉल्ट नहीं है) के साथ संकलित किया गया है, स्थानीय लोगों को एक निश्चित नकारात्मक ऑफसेट पर आवंटित किया जाता है %ebp से।

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

यदि आप नहीं कर सकते हैं (उदा। क्योंकि कोड तीसरे पक्ष से आया था), तो आपको सावधानीपूर्वक सावधानी बरतनी होगी, और अनुमान लगाना होगा। यदि आपको लगता है कि कुछ मान %ebp-8 पर संग्रहीत हैं, तो आप उस मूल्य को जीडीबी के साथ उसी तरह जांच सकते हैं जैसे आप सकारात्मक ऑफ़सेट की जांच करते हैं: (gdb) x/wx $ebp-8

सावधान: संकलक बाहर स्थानीय किसी भी तरह से यह चाहता है बिछाने के लिए नि: शुल्क है, इसलिए यदि आप घोषित

int x, y, z; 

संकलक %ebp-12 पर %ebp-16 पर x, %ebp-20 पर y, और z स्टोर करने के लिए स्वतंत्र है।

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