2011-10-18 16 views
9

में डिस्सेप्लर रजिस्टरों को प्रिंट करने के लिए कैसे करें मैं कुछ डिस्सेप्लर कोड देख रहा हूं और 0x01c8f09b <+0015> mov 0x8(%edx),%edi जैसे कुछ देख रहा हूं और मुझे आश्चर्य है कि %edx या %edi का मान क्या है।एक्सकोड कंसोल

%edx या अन्य असेंबली चर के मान को मुद्रित करने का कोई तरीका है? क्या %edx अंक पर स्मृति पते पर मान मुद्रित करने का कोई तरीका है (मुझे लगता है कि edx एक रजिस्टर है जिसमें एक सूचक है ... यहां कुछ है)।

उदाहरण के लिए, आप कंसोल में po टाइप करके ओबेट प्रिंट कर सकते हैं, तो असेंबली में प्रिंटिंग रजिस्टरों/चर के लिए एक कमांड या सिंटैक्स है?

पृष्ठभूमि:

मैं इस लाइन पर EXC_BAD_ACCESS हो रही है और मैं डिबग करने के लिए क्या चल रहा है करना चाहते हैं। मुझे पता है कि यह त्रुटि स्मृति प्रबंधन से संबंधित है और मैं यह पता लगाने की सोच रहा हूं कि मैं कहां से गुम हो सकता हूं/बहुत से बरकरार/रिलीज/ऑटोरेलीज कॉल।

अतिरिक्त जानकारी:

यह आईओएस पर है, और अपने आवेदन iPhone सिम्युलेटर में चल रहा है।

उत्तर

14

आप एक रजिस्टर मुद्रित कर सकते हैं (जैसे, eax) का उपयोग:

print $eax 

या छोटे के लिए:

p/x $eax 

करने के लिए:

p $eax 

हेक्साडेसिमल के रूप में यह मुद्रित करने के लिए एक रजिस्टर द्वारा इंगित मूल्य प्रदर्शित करें:

x $eax 

चेक अधिक जानकारी के लिए gdb मदद:

help print 
help x 
2

वे चर नहीं हैं, लेकिन पंजीयक हैं।

GDB में, आप निम्न आदेश का उपयोग करके मानक रजिस्टरों के मूल्यों देख सकते हैं:

info registers 

ध्यान दें कि एक रजिस्टर पूर्णांक मान हैं (आपके मामले में 32bits, के रूप में रजिस्टर नाम e लगाया जाता है) । यह क्या प्रतिनिधित्व करता है ज्ञात नहीं है। यह एक सूचक, एक पूर्णांक, ज्यादातर कुछ भी हो सकता है।

यदि po क्रैश होता है जब आप किसी सूचक के मान को सूचक के रूप में मुद्रित करने का प्रयास करते हैं, तो यह संभावना है कि मान एक सूचक (या एक अवैध नहीं है)।

9
(gdb) info reg 
eax   0xe 14 
ecx   0x2844e0 2639072 
edx   0x285360 2642784 
ebx   0x283ff4 2637812 
esp   0xbffff350 0xbffff350 
ebp   0xbffff368 0xbffff368 
esi   0x0 0 
edi   0x0 0 
eip   0x80483f9 0x80483f9 <main+21> 
eflags   0x246 [ PF ZF IF ] 
cs    0x73 115 
ss    0x7b 123 
ds    0x7b 123 
es    0x7b 123 
fs    0x0 0 
gs    0x33 51 

Debugging with gdb से:

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

info registers 

प्रिंट के नाम और सभी रजिस्टरों के मूल्यों फ्लोटिंग प्वाइंट रजिस्टरों (चयनित ढेर फ्रेम में) को छोड़कर।

info all-registers 

प्रिंट के नाम और सभी रजिस्टरों के मूल्यों, फ्लोटिंग प्वाइंट रजिस्टरों भी शामिल है।

info registers regname ... 

प्रत्येक निर्दिष्ट रजिस्टर regname के relativized मूल्य मुद्रित करें। regname आपके द्वारा उपयोग की जा रही मशीन पर प्रारंभिक `$ 'के साथ या उसके बिना वैध पंजीकरण नाम हो सकता है।

8

जो Xcode संकलक/डिबगर उपयोग कर रहे हैं अप निर्भर करता है। जीसीसी के लिए/GDB यह

info registers 

लेकिन बजना के लिए है/lldb आप LLDB उपयोग कर रहे हैं यह

register read 
4

है बजाय GDB का उपयोग कर सकते हैं register read