GDB में रजिस्टर मान कैसे प्रिंट करें?


191

मैं का मूल्य कैसे प्रिंट करूं %eaxऔर %ebp?

(gdb) p $eax
$1 = void

8
layout regGdb का उपयोग सभी पूर्णांक और ध्वज रजिस्टरों की एक तालिका दिखाने के लिए करते हैं, जो पिछले निर्देश द्वारा परिवर्तित किए गए हैं। उदाहरण के लिए stackoverflow.com/tags/x86/info देखें ।
पीटर कॉर्ड्स

जवाबों:


232

info registersसभी रजिस्टर दिखाता है; info registers eaxसिर्फ रजिस्टर दिखाता है eax। कमांड को संक्षिप्त रूप में देखा जा सकता हैi r


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

1
समान समस्या:% eax कोड में है, फिर भी $ ex शो शून्य दिखाता है।
रुस्लान Yushchenko

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

मैं lldb के लिए एक ही चीज़ की खोज कर रहा था, इसलिए मुझे ध्यान दें: lldb के लिए, कमांड हैregister read [eax]
holgac

यदि आप उस कोड मान को लगातार प्रदर्शित करना चाहते हैं जैसा कि आप उस कोड के माध्यम से करते हैं जिसका आप उपयोग कर सकते हैं display। उदाहरण के लिए display $eax
श्रीगांकी १15

50

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

info registers eip

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

info registers rip

इन्हें संक्षिप्त किया जा सकता है:

i r rip

37

वहाँ भी:

info all-registers

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


3
यह उन रजिस्टरों के बारे में पढ़ाया जाता है जो मुझे पता नहीं था :-)
सिरो सेंटिल्ली 冠状 isters isters isters at

1
मेरी मशीन पर, यह प्रिंट eax, ecxऔर अन्य मानक रजिस्टरों से छिपा हुआ info registers। यह संभवतः स्वीकृत उत्तर होना चाहिए।
EntangledLoops

15
  • यदि केवल इसे एक बार जांचना चाहते हैं, तो info registersरजिस्टर दिखाएं।
  • यदि केवल एक रजिस्टर देखना चाहते हैं, उदाहरण के लिए, display $espgdb कमांड लाइन में एस्प रजिस्टर प्रदर्शित करते रहें।
  • यदि सभी रजिस्टर देखना चाहते हैं layout regs, तो टीयूआई मोड के साथ शो रजिस्टर जारी रखें।

12

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) शामिल करें।
  • i r f: सभी FPU फ्लोटिंग रजिस्टर ( st0-7और कुछ अन्य f*) प्रिंट करें

इसके अलावा अन्य रजिस्टर समूह a( all) और f( float) के साथ मिल सकते हैं:

maint print reggroups

के रूप में प्रलेखित: https://sourceware.org/gdb/current/onbuildocs/gdb/Registers.html##egisters

टिप्स :

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

6

p $eax GDB 7.7.1 के रूप में काम करता है

GDB 7.7.1 के अनुसार, आपके द्वारा काम की गई कमांड:

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

इस सिंटैक्स का उपयोग एआरएम फ़्लोटिंग पॉइंट रजिस्टरों के लिए विभिन्न यूनियन सदस्यों के बीच चयन करने के लिए भी किया जा सकता है जो फ़्लोटिंग पॉइंट या पूर्णांक हो सकते हैं:

p $s0.f
p $s0.u

से डॉक्स :

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

और :

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

लेकिन मेरे पास अब तक नियंत्रण रजिस्टर के साथ बहुत अधिक भाग्य नहीं है: OSDev 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

एआरएम फ्लोटिंग प्वाइंट रजिस्टर

देखें: /reverseengineering/8992/floating-point-registers-on-arm/20623#20623


2
इस $सिंटैक्स के साथ अभिव्यक्तियों में रजिस्टरों का उपयोग करने में सक्षम होना बहुत अच्छा है ।
रीसायकल करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.