2013-02-20 40 views
8

से वर्तमान स्टैक पॉइंटर को पुनर्प्राप्त करना मैं gdb का उपयोग कर एक मूल सी प्रोग्राम निष्पादित कर रहा हूं। मेरे पास main() की शुरुआत में ब्रेक पॉइंट है। कोड चलाने के बाद, जीडीबी मुख्य() पर अपेक्षित रूप से टूट जाता है। अब अगर मैं ढेर सूचक रजिस्टर (आरएसपी) की जांच, मैं जब मैं cat /proc/17232/stat | cut -d" " -f29/proc का उपयोग कर एक ही जानकारी को पुनः प्राप्त/st/pid/stat

0x7fffffffe170: 0x00000000. 

दिखाई दे रही है (जहां 17,232 है इस प्रक्रिया के लिए पीआईडी), मैं देख रहा हूँ:

140737488347112 (which in hex is: 0x7fffffffdfe8). 

हम जीडीबी से वर्तमान स्टैक पॉइंटर का एक अलग मूल्य कैसे देखते हैं। और यह भी, क्यों gdb आरएसपी की सामग्री को NULL (0x00000000) के रूप में दिखा रहा है?

धन्यवाद।

उत्तर

2

/proc

(gdb) info register rsp 
rsp   0x7fffffffe480 0x7fffffffe480 

से प्रिंट करना आरएसपी रजिस्टर (64b CPUs पर) से /proc

[email protected]:~$ cat /proc/22219/stat | cut -d" " -f29 | perl -e 'print(sprintf("%x\n",<>));' 
7fffffffe338 

के बाद से gdb एक मजबूर करने के लिए है वास्तव में एक की तुलना में एक अलग मूल्य देता है की शुरुआत में कार्यक्रम में interruption मुख्य फ़ंक्शन क्रम में निष्पादन को लेने के लिए, और डेटा का एक न्यूनतम सेट (वापसी पता, कुछ रजिस्ट्रार बैकअप) ढेर पर सहेजा जाता है। gdb तब, अपने स्वयं के ढेर का उपयोग प्रोग्राम को ओवरफ़्लो नहीं करने के लिए करता है, और जब आप रजिस्टरों को देखने का अनुरोध करते हैं, या स्टैक डेटा पर काम करते हैं तो आवश्यक समायोजन संचालन करता है - और आंतरिक gdb खाना पकाने नहीं दिखाता है। हालांकि /proc असली डेटा, अपरिवर्तित दिखाता है।

"असली" आरएसपी/proc से पर के बाद से 86 CPUs ढेर नीचे बढ़ता है, gdb एक से थोड़ा कम वास्तव में है।

अशक्त मूल्य के लिए के रूप में, यह मेरे परीक्षण के दौरान ऐसा नहीं हुआ

(gdb) x 0x7fffffffe480 
0x7fffffffe480: 0xffffe578 
+0

स्पष्टीकरण के लिए धन्यवाद। यह पता लगाने की कोशिश करेगा कि स्मृति को मेरे परीक्षण में शून्य के रूप में क्यों दिखाया गया है। –