2012-12-25 37 views
7

मैं उबंटू 12.10 64 बिट पर चल रहा हूं।जीडीबी शिकायत नहीं करता कोई स्रोत उपलब्ध नहीं

मैं जीडीबी में एक साधारण असेंबली कार्यक्रम डीबग करने की कोशिश कर रहा हूं। हालांकि जीडीबी का गुई मोड (-tui) मेरी असेंबली फ़ाइल के स्रोत कोड को खोजने में असमर्थ लगता है। मैंने वर्तमान में निर्देशिका में प्रोजेक्ट का पुनर्निर्माण किया है और Google को कोई फायदा नहीं हुआ है, कृपया मेरी मदद करें।

मेरे आदेशों:

nasm -f elf64 -g -F dwarf hello.asm 

gcc -g hello.o -o hello 

gdb -tui hello 

डिबग जानकारी लोड किया जा रहा है, मैं() मुख्य में एक ब्रेकपाइंट लेकिन शीर्ष आधी स्क्रीन अभी भी कहते हैं, '[कोई स्रोत उपलब्ध]' सेट कर सकते हैं।

; hello.asm a first program for nasm for Linux, Intel, gcc 
; 
; assemble: nasm -f elf -l hello.lst hello.asm 
; link:  gcc -o hello hello.o 
; run:   hello 
; output is: Hello World 

    SECTION .data  ; data section 
msg: db "Hello World",10 ; the string to print, 10=cr 
len: equ $-msg  ; "$" means "here" 
       ; len is a value, not an address 

    SECTION .text  ; code section 
     global main  ; make label available to linker 
main:    ; standard gcc entry point 

    mov edx,len  ; arg3, length of string to print 
    mov ecx,msg  ; arg2, pointer to string 
    mov ebx,1  ; arg1, where to write, screen 
    mov eax,4  ; write command to int 80 hex 
    int 0x80  ; interrupt 80 hex, call kernel 

    mov ebx,0  ; exit code, 0=normal 
    mov eax,1  ; exit command to kernel 
    int 0x80  ; interrupt 80 hex, call kernel 
+0

कारण के लिए नीचे दिए गए उत्तर को हटाया गया। –

+1

एक असेंबलर द्वारा उत्पादित एक प्रोग्राम में डीबग जानकारी नहीं है। कंपाइलर (उदा। 'Gcc -g') एंबलर निर्देश या संरचना के रूप में डीबग जानकारी का उत्पादन कर रहा है। तो आपके प्रश्न का असली अर्थ नहीं है। हालांकि, 'gdb' एक बार, चरण-दर-चरण, मशीन निर्देशों में एक बार चलाने में सक्षम है। –

+0

क्या आपके पास इसके लिए कोई समाधान है? –

उत्तर

4

इस मामले में समस्या यह है कि कोडांतरक डिबगर के लिए लाइन नंबर की जानकारी नहीं दे रहा है:

यहाँ hello.asm यदि आप रुचि रखते हैं है। तो हालांकि स्रोत वहां है (यदि आप जीडीबी में "सूची" करते हैं, तो यह स्रोत फिएल की एक सूची दिखाता है - कम से कम जब मैं आपके चरणों का पालन करता हूं, तो यह करता है), लेकिन डीबगर को फ़ाइल से लाइन-नंबर की जानकारी चाहिए कौन सी रेखा किस पते से मेल खाती है। यह जानकारी दी गई जानकारी के साथ ऐसा नहीं कर सकता है।

जहां तक ​​मुझे मिल सकता है, उदाहरण के लिए gcc का उपयोग करते समय NASC को 0lद्वारा उपयोग किया जाने वाला .loc निर्देश जारी करने का कोई तरीका नहीं है। लेकिन as आपकी स्रोत फ़ाइल को गैज़िलियन त्रुटियों के उत्पन्न करने में सक्षम नहीं है [यहां तक ​​कि -msyntax = intel -mmnemonic = intel - आप सोचते हैं कि shoudl काम]।

तो जब तक कुछ और चालाक .loc प्रविष्टियों को उत्पन्न करने के तरीके से नहीं आ सकता है जो डीबगर लाइन नंबर की जानकारी देता है, तो मुझे पूरा यकीन नहीं है कि हम आपके प्रश्न का उत्तर कैसे दे सकते हैं जिससे आप खुश रह सकें साथ में।

+1

धन्यवाद। मैं NASM के साथ एक बग रिपोर्ट दर्ज कर रहा हूँ। –

+0

हास्यास्पद। मुझे एक सी प्रोग्राम और जीडीबी टेक्स्ट ui के साथ ओपी के समान समस्या थी।मैंने सूची हिट की और सबकुछ काम करता प्रतीत होता है जब मैंने अभी टाइप की गई 'सूची' कमांड दबाई। – gideon

+0

@IrespresponsibleNewb क्या आपने बग रिपोर्ट दर्ज की है? संपर्क? – BeeOnRope

4

यह कथन गलत है।

असेंबलर लाइन संख्या जानकारी (नोट-जी-एफ बौने) बिट्स का उत्पादन करता है।

दूसरी ओर वह 64 बिट्स के रूप में स्पष्ट रूप से 32-बिट कोड को जोड़ता है, जो काम कर सकता है या नहीं भी हो सकता है।

अब अगर NASM के डिबगिंग आउटपुट में बग हैं तो हमें यह जानने की आवश्यकता है।

त्वरित प्रयोग के एक जोड़े को पता चलता है कि addr2line (लेकिन GDB नहीं!) डिकोड एनएएसएम-उत्पन्न लाइन नंबर सही ढंग से stabs का उपयोग कर, लेकिन बौना का उपयोग नहीं कर जानकारी करता है, तो वहाँ शायद कुछ रास्ता एनएएसएम बौना को बनाने वाला गलत है .. लेकिन जीडीबी के साथ कुछ अजीब भी।

जीएनयू addr2line संस्करण 2.22.52.0.1-10.fc17 20120131, जीएनयू जीडीबी (जीडीबी) फेडोरा (7.4.50.20120120-52.fc17))।

+0

हम्म। समस्या को कम करने के लिए मुझे किस प्रकार के परीक्षण करना चाहिए? –