मेरे पास एक x86_64 असेंबली प्रोग्राम है जिसे मैं लिनक्स पर डीबग करने का प्रयास कर रहा हूं, लेकिन जब मैं gdb का उपयोग करने का प्रयास करता हूं, तो यह बेतरतीब ढंग से इधर-उधर हो जाता है और एक ही युगल निर्देशों के माध्यम से लूप करता है या निर्देशों को दोहराता है। यह अलग-अलग निर्देशों के माध्यम से लूप लगता है, जहां मैं ब्रेकपॉइंट सेट करता हूं।

मैंने इस समस्या पर ऑनलाइन शोध करने की कोशिश की, और मैंने देखा कि कई लोगों को सी ++ के साथ एक ही समस्या है जब कंपाइलर बहुत आक्रामक तरीके से अनुकूलन कर रहे थे और गलत डिबगिंग जानकारी उत्पन्न कर रहे थे। मैंने असेंबली के बारे में कुछ नहीं देखा, लेकिन मेरा मानना ​​है कि yasm यहां भी समस्या हो सकती है।

यहां मेरा मेकफ़ाइल है।

myprog : myprog.o
    gcc -static -fdwarf2-cfi-asm myprog.o -o myprog
myprog.o : myprog.asm
    yasm -f elf64 -g dwarf2 myprog.asm -o myprog.o

ध्यान दें कि मैं स्थिर रूप से लिंक कर रहा हूं क्योंकि मुझे काम करने के लिए गतिशील लिंकिंग नहीं मिल रही है। मैं भविष्य में इसके बारे में एक अलग प्रश्न पूछ सकता हूं।

और यहाँ कमोबेश gdb सत्र कैसा दिखता है।

...
(gdb)@ n
65  call findrepl
(gdb)@ n
73  mov rdi, str3
(gdb)@ n
75  call findrepl
(gdb)@ n
75  call findrepl
(gdb)@ n
65  call findrepl
...

s, si, या ni का उपयोग करके ऊपर दिखाए गए n के समान ही करें। मेरे पिछले विधानसभा कार्यक्रमों के साथ मेरा यह मुद्दा नहीं है। कभी-कभी gdb कहेगा कि मैंने xor eax, eax जैसा कुछ निष्पादित किया है, लेकिन फिर मेरे द्वारा printf को किए गए कॉल से आउटपुट दिखाएं।

मैं असेंबली प्रोग्रामिंग और gdb के लिए अपेक्षाकृत नया हूं, इसलिए मेरे दिमाग के पीछे मुझे आश्चर्य है कि क्या यह मेरी गलती है। क्या इसे ठीक करने का कोई तरीका है? मैं यह भी जानना चाहूंगा कि क्या कोई समाधान है, क्योंकि मैं gdb का उपयोग किए बिना इसे डीबग नहीं कर सकता।

3
Robert Wilson 13 सितंबर 2019, 19:56

1 उत्तर

सबसे बढ़िया उत्तर

बहुत परीक्षण और त्रुटि के बाद, मैंने gdb के लिए '-tui' विकल्प और 'लेआउट asm' कमांड की खोज की। ऐसा करने का शायद एक बेहतर तरीका है, लेकिन यहां मूल रूप से आप इसे काम करने के लिए टाइप करते हैं:

[user@comp ~/prog/]$ gdb -tui myprog
(gdb)@ layout asm
(gdb)@ break main
(gdb)@ run

और फिर आप जंगली जा सकते हैं। डिफ़ॉल्ट रूप से, इसे एटी एंड टी नोटेशन में अलग किया जाता है। आप show disassembly-flavor के साथ जांच सकते हैं कि यह वर्तमान में कौन सा संकेतन प्रदर्शित कर रहा है। आप इसे set disassembly-flavor intel या set disassembly-flavor att से बदल सकते हैं।

अधिक जानकारी के लिए, help tui, help layout, या help set disassembly-flavor को gdb में चलाएं।

0
Robert Wilson 16 सितंबर 2019, 17:56