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.obreak _start会正常显示源码文件与行号,layout regs视图、单步跟踪时的源码定位功能都可正常工作。 - 临时方案:如果不想重新编译二进制,可以在GDB中关闭严格调试信息校验,执行以下内置命令后再加载程序:
若需要永久生效,将上述两行配置写入当前用户家目录下的set debug dwarf-read off set complaints 0.gdbinit文件即可。
内容的提问来源于stack exchange,提问作者Joey Shepard
相关产品推荐
相关产品推荐

