2011-03-25 18 views
124

मैं %eax और %ebp का मूल्य कैसे प्रिंट करूं?कैसे GDB में रजिस्टर मूल्यों मुद्रित करने के लिए?

(gdb) p $eax 
$1 = void 
+2

जीडीबी को सभी पूर्णांक और ध्वज रजिस्टरों की एक तालिका दिखाने के लिए 'लेआउट reg' का उपयोग करें, जो पिछले निर्देश द्वारा बदला गया एक (ओं) को हाइलाइट करता है। उदाहरण के लिए http://stackoverflow.com/tags/x86/info देखें। –

उत्तर

149

info registers सभी रजिस्टरों पता चलता है; info registers eax शो सिर्फ रजिस्टर eax। आप GDB में एक विशिष्ट रजिस्टर मुद्रित करने के लिए प्रयास कर रहे हैं आदेश के रूप में i r

+0

मुझे मिलता है: अमान्य रजिस्टर '% eax ' और यदि मैं बस" जानकारी पंजीयक "करता हूं तो ईएक्स दिखाई नहीं देता है। फिर भी मैं आईडीई में अपनी कोड असेंबली देख रहा हूं जहां एक EXC_BAD_ACCESS सिग्नल निर्देश के साथ उत्पन्न किया गया है: परीक्षण% eax,% eax यह एक्सकोड चल रहा है gdb। जीडीबी ईएक्स रजिस्टर की रिपोर्ट क्यों नहीं कर रहा है? – NoahR

+1

वही समस्या:% ईएक्स कोड में है, फिर भी $ eax शो शून्य प्रिंट करें। –

+4

ब्रिजेटे का जवाब मेरे लिए काम करता है। geekosaur का जवाब अधिकतर सही है, लेकिन आपको% साइन को छोड़ना होगा, इसलिए किसी विशिष्ट रजिस्टर के लिए आदेश 'जानकारी रजिस्ट्रार eax' है। मुझे यकीन नहीं है कि यह जीडीबी के विभिन्न संस्करणों के लिए अलग है, हालांकि। – Kevin

37

संक्षिप्त किया जा सकता है, तो आप% चिह्न छोड़ दिया है। उदाहरण के लिए,

info registers eip 

यदि आपका निष्पादन योग्य 64 बिट है, तो पंजीयक आर के साथ शुरू होते हैं। ई के साथ शुरू करना मान्य नहीं है।

info registers rip 

उन को संक्षिप्त जा सकता है:

i r rip 
30

वहाँ भी है:

info all-registers 

तो फिर तुम रजिस्टर नाम प्राप्त कर सकते हैं आप में रुचि रखते हैं - platform- खोजने के लिए बहुत उपयोगी विशिष्ट रजिस्ट्रार (जैसे एनईओएन क्यू ... एआरएम पर)।

+3

यह उन रजिस्टरों के बारे में सिखाया गया है जिन्हें मैं अस्तित्व में नहीं जानता था :-) –

+1

मेरी मशीन पर, यह प्रिंट 'eax', 'ecx', और' रजिस्ट्रार रजिस्टर्स 'द्वारा छिपा अन्य मानक रजिस्ट्रार। यह शायद स्वीकार्य उत्तर होना चाहिए। – EntangledLoops

1

GDB 7.7.1 के रूप में, आदेश आप की कोशिश की है काम करता है:

set $eax = 0 
p $eax 
# $1 = 0 
set $eax = 1 
p $eax 
# $2 = 1 

the docs से:

किसी भी नाम '$' से पहले एक सुविधा चर के लिए इस्तेमाल किया जा सकता, जब तक कि यह पूर्वनिर्धारित मशीन-विशिष्ट रजिस्टर नामों में से एक न हो।

and:

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

लेकिन मुझे अभी तक नियंत्रण रजिस्टरों के साथ बहुत भाग्य नहीं मिला है: ओएसडीव 2012 http://f.osdev.org/viewtopic.php?f=1&t=25968 || 2005 सुविधा अनुरोध https://www.sourceware.org/ml/gdb/2005-03/msg00158.html || alt.lang.asm 2013 https://groups.google.com/forum/#!topic/alt.lang.asm/JC7YS3Wu31I

7
  • अगर केवल एक बार यह जाँच करना चाहते हैं, info registers शो रजिस्टरों।
  • अगर केवल उदाहरण के लिए एक रजिस्टर घड़ी, चाहते हैं, display $esp जारी रखने के gdb कमांड लाइन में प्रदर्शन esp रजिस्टरों।
  • यदि सब रजिस्टरों घड़ी चाहते हैं, layout regs शो रजिस्टर, TUI मोड के साथ जारी है।
5

Gdb आदेश:

  • i r <register_name>: एक ही रजिस्टर प्रिंट, ई।जी i r rax, i r eax
  • i r <register_name_1> <register_name_2> ...: कई रजिस्टरों प्रिंट, उदा i r rdi rsi,
  • i r: चल बिन्दु & वेक्टर रजिस्टर (XMM, YMM, ZMM) को छोड़कर सभी रजिस्टर मुद्रित करें।

  • i r a: सभी रजिस्टर प्रिंट करें, फ्लोटिंग पॉइंट & वेक्टर रजिस्टर (xmm, ymm, zmm) शामिल करें।

टिप्स:

  • xmm0 ~ xmm15, 128 बिट, लगभग हर आधुनिक मशीन यह, वे 1999
  • ymm0 ~ ymm15 में जारी किया जाता है है, 256 बिट्स, नया कर रहे हैं मशीन आमतौर पर यह होती है, उन्हें 2011 में रिलीज़ किया जाता है।
  • zmm0 ~ zmm31, 512 बिट्स, सामान्य पीसी शायद यह 2016 (वर्ष 2016) के रूप में नहीं है, वे 2013 में जारी किए जाते हैं, और मुख्य रूप से अब तक सर्वरों में उपयोग किए जाते हैं।
  • xmm/ymm/zmm का केवल एक धारावाहिक दिखाया जाएगा, क्योंकि वे अलग-अलग मोड में एक ही रजिस्ट्रार हैं। मेरी मशीन पर ymm दिखाया गया है।
संबंधित मुद्दे