NASM使用%line指令生成DWARF调试信息行号不符问题
问题成因
- 行号整体+1:NASM 默认的
%line n filename语义为将 %line 指令所在行的逻辑行号设为n,后续每一行(包括空行、指令行)的逻辑行号自动+1。你写的%line 1 test.txt所在行对应逻辑行1,下一行的PUSH 1337就自动对应逻辑行2,和你观测到的现象完全吻合。 - RET 额外出现13号行:你最后一条
%line 10 test.txt对应逻辑行10,下一行的POP RAX对应11,之后的两条空行分别对应12、最后一行的RET就对应13,所以出现了多余的13号行记录。
解决方法
- 调整%line写法:使用带加号的
%line n+ filename语法,该语法明确指定n为 %line指令后第一条非空行的逻辑行号,完全符合你的预期。修改后对应的汇编代码如下:
global main section .text main: %line 1+ test.txt PUSH 1337 %line 2+ test.txt PUSH 1338 %line 3+ test.txt PUSH 1339 %line 8+ test.txt POP RAX %line 9+ test.txt POP RAX %line 10+ test.txt POP RAX RET
- 处理RET的多余行号:如果不需要RET关联调试行号,可以在RET前加
[DEBUG LINES OFF]关闭行号记录;如果需要指定RET的行号,直接在RET前加对应%line n+ test.txt即可;也可以将RET紧接在最后一条POP RAX之后,避免空行带来的行号自动递增。 - 替代方案:如果你不想修改%line语法,也可以直接把所有%line后的数值减1编写,比如要指定后续指令对应行1,就写
%line 0 test.txt,也能达到相同效果。
内容的提问来源于stack exchange,提问作者Sindre
相关产品推荐
相关产品推荐

