You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GDB调试NASM编译的x86-64程序无法显示源码行号的问题

问题成因
  • 该问题是新版GDB与旧版NASM生成的DWARF调试信息不兼容导致:
    • Ubuntu 22.04搭载的GDB 12.x版本默认对DWARF调试信息做严格格式校验,优先适配DWARF 4/5标准。而NASM 2.15.05默认生成的是DWARF v3格式的调试信息,且生成的行号表未正确标记编译单元对应的地址范围,GDB做地址到源码行的映射时,仅能在最开始加载时读取到源码文本,单步执行后PC地址偏移就无法匹配到对应的行号条目。
    • objdump -g能看到完整行号表是因为objdump对DWARF信息的解析逻辑更宽松,不会强制校验地址范围关联,因此会呈现出“调试信息存在但GDB无法识别”的现象。
解决方法
  • 优先方案:汇编时显式指定NASM生成DWARF v4格式的调试信息,替换原有编译命令即可:
    nasm -f elf64 -g -F dwarf -dwarf-version=4 -o foo.o foo.asm
    ld -o foo foo.o
    
    重新编译链接后再调试,break _start会正常显示源码文件与行号,layout regs视图、单步跟踪时的源码定位功能都可正常工作。
  • 临时方案:如果不想重新编译二进制,可以在GDB中关闭严格调试信息校验,执行以下内置命令后再加载程序:
    set debug dwarf-read off
    set complaints 0
    
    若需要永久生效,将上述两行配置写入当前用户家目录下的.gdbinit文件即可。

内容的提问来源于stack exchange,提问作者Joey Shepard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:01:14