2012-12-25 37 views
7

Tôi đang chạy trên Ubuntu 12,10 64bit.GDB than phiền Không có nguồn nào

Tôi đang cố gỡ lỗi chương trình lắp ráp đơn giản trong GDB. Tuy nhiên chế độ gui của GDB (-tui) dường như không thể tìm thấy mã nguồn của tập tin lắp ráp của tôi. Tôi đã xây dựng lại dự án trong thư mục hiện tại và tìm kiếm trên google để không có kết quả, vui lòng giúp tôi ở đây.

lệnh của tôi:

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

gcc -g hello.o -o hello 

gdb -tui hello 

thông tin gỡ lỗi dường như được nạp, tôi có thể thiết lập một breakpoint ở main() nhưng nửa trên màn hình vẫn nói '[Không có Nguồn Trước]'.

Đây là hello.asm nếu bạn quan tâm:

; 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

Đã xóa xem câu trả lời bên dưới vì lý do. –

+1

Một chương trình được sản xuất bởi một bộ lắp ráp không có thông tin gỡ lỗi. Trình biên dịch (ví dụ: 'gcc -g') đang tạo thông tin gỡ lỗi như chỉ thị hoặc cấu trúc của trình biên dịch. Vì vậy, câu hỏi của bạn không có ý nghĩa thực sự. Tuy nhiên, 'gdb' có thể chạy một lần tại một thời điểm, từng bước, hướng dẫn máy. –

+0

Bạn có giải pháp nào cho việc này không? –

Trả lời

4

Các vấn đề trong trường hợp này là lắp ráp không được sản xuất thông tin dòng số cho trình gỡ lỗi. Vì vậy, mặc dù nguồn là có (nếu bạn "liệt kê" trong gdb, nó cho thấy một danh sách của nguồn fiel - ít nhất là khi tôi làm theo các bước của bạn, nó có), nhưng trình gỡ rối cần thông tin số dòng từ tệp để biết dòng nào tương ứng với địa chỉ nào. Nó không thể làm điều đó với thông tin được đưa ra.

Theo như tôi có thể tìm thấy, không có cách nào để đưa NASM ra chỉ thị .loc được sử dụng bởi as khi sử dụng gcc chẳng hạn. Nhưng as không thể lấy tệp nguồn của bạn mà không tạo ra lỗi gazillion [ngay cả với -msyntax = intel -mmnemonic = intel - bạn giả sử nghĩ rằng công việc shoudl]. Vì vậy, trừ khi một số người thông minh hơn có thể tìm ra cách để tạo các mục .loc cung cấp thông tin số dòng của trình gỡ lỗi, tôi không hoàn toàn chắc chắn cách chúng ta có thể trả lời câu hỏi của bạn theo cách mà bạn sẽ hài lòng với.

+1

Cảm ơn. Tôi đang gửi báo cáo lỗi với NASM. –

+0

vui nhộn. Tôi đã có cùng một vấn đề như OP với một chương trình c và gdb văn bản ui.Tôi nhấn danh sách và tất cả mọi thứ dường như làm việc khi tôi chỉ nhấn gõ lệnh 'list'. – gideon

+0

@IrresponsibleNewb bạn đã gửi báo cáo lỗi chưa? Liên kết? – BeeOnRope

4

Tuyên bố này là sai.

Bộ lắp ráp không tạo thông tin số dòng (lưu ý các bit -g -F lùn).

Mặt khác, ông lắp ráp những gì rõ ràng là mã 32 bit là 64 bit, có thể có hoặc không hoạt động.

Bây giờ nếu có lỗi trong kết quả gỡ lỗi của NASM, chúng ta cần biết điều đó. Một số thử nghiệm nhanh cho thấy rằng addr2line (nhưng không phải gdb!) không giải mã thông tin số dòng do NASM tạo ra một cách chính xác bằng cách sử dụng stabs nhưng không sử dụng lùn, vì vậy có thể có điều gì đó sai trong cách NASM tạo DWARF .. nhưng cũng có điều gì đó kỳ quặc với gdb.

Phiên bản bổ sung GNU 2.22.52.0.1-10.fc17 20120131, GNU gdb (GDB) Fedora (7.4.50.20120120-52.fc17)).

+0

Hmm. Tôi nên thực hiện loại thử nghiệm nào để thu hẹp sự cố? –