【问题标题】:GDB complains No Source AvailableGDB 抱怨没有可用的资源
【发布时间】:2012-12-11 05:57:08
【问题描述】:

我在 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

【问题讨论】:

  • 删除原因见下方答案。
  • 由汇编程序生成的程序没有调试信息。编译器(例如gcc -g)正在生成调试信息作为汇编指令或构造。所以你的问题没有真正的意义。但是,gdb 能够一次运行一次,逐步执行机器指令。
  • 您对此有什么解决方案吗?

标签: linux assembly gdb nasm


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。我正在向 NASM 提交错误报告。
  • 好笑。我遇到了与带有 c 程序和 gdb text ui 的 OP 相同的问题。我点击了列表,当我点击输入list 命令时,一切似乎都正常。
  • @IrresponsibleNewb 你提交错误报告了吗?链接?
【解决方案2】:

这个说法是错误的。

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

另一方面,他将明显是 32 位的代码组装成 64 位,这可能有效,也可能无效。

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

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

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

【讨论】:

  • 嗯。我应该执行什么样的测试来缩小问题范围?
猜你喜欢
  • 2018-06-25
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
相关资源
最近更新 更多