10

我在 Ubuntu 12.10 64 位上运行。

我正在尝试在 GDB 中调试一个简单的汇编程序。但是 GDB 的 gui 模式 (-tui) 似乎无法找到我的程序集文件的源代码。我已经在当前目录中重建了项目并搜索了谷歌无济于事,请在这里帮助我。

我的命令:

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

gcc -g hello.o -o hello

gdb -tui hello

调试信息似乎已加载,我可以在 main() 处设置断点,但屏幕上半部分仍显示“ [No Source Available] ”。

如果您有兴趣,这里是 hello.asm:

;  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
4

2 回答 2

8

这种说法是错误的。

汇编器确实会产生行号信息(注意 -g -F dwarf)位。

另一方面,他将显然是 32 位的代码组装成 64 位,这可能会也可能不会。

现在,如果 NASM 的调试输出中存在错误,我们需要知道这一点。

一些快速实验表明 addr2line(但不是 gdb!)确实使用 stabs 但不使用 dwarf 正确解码 NASM 生成的行号信息,因此 NASM 生成 DWARF 的方式可能有问题......但也有一些奇怪的地方数据库。

GNU addr2line 版本 2.22.52.0.1-10.fc17 20120131,GNU gdb (GDB) Fedora (7.4.50.20120120-52.fc17))。

于 2012-12-29T17:44:26.663 回答
5

这种情况下的问题是汇编器没有为调试器生成行号信息。所以虽然源是存在的(如果你在 gdb 中“列出”,它会显示源文件的列表 - 至少当我按照你的步骤操作时,它确实如此),但调试器需要文件中的行号信息才能知道什么行对应什么地址。它不能用给出的信息做到这一点。

据我所知,没有办法让 NASM 发出例如使用as时使用的 .loc 指令。gcc但是as无法在不产生大量错误的情况下获取您的源文件[即使使用 -msyntax=intel -mmnemonic=intel - 你会认为这应该有效]。

因此,除非更聪明的人能想出一种方法来生成提供调试器行号信息的 .loc 条目,否则我不完全确定我们如何以您满意的方式回答您的问题。

于 2012-12-25T12:10:07.227 回答