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

为何单步编译链接汇编源码会丢失调试信息?

Clang单步编译汇编文件生成DWARF调试信息的解决方案

当你分两步编译汇编源码时:

localhost % clang -g -c factorial.s       
localhost % clang -o factorial factorial.o

LLDB可以正常获取汇编源码的调试信息:

localhost % lldb factorial
(lldb) target create "factorial"
Current executable set to '/Users/chris/Dev/assembly/learning-assembly/chapter11/factorial' (x86_64).
(lldb) source info -f factorial.s 

Lines found for file factorial.s in compilation unit factorial.s in `factorial
[0x0000000100003f89-0x0000000100003f8b): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:10
[0x0000000100003f8b-0x0000000100003f8d): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:13
[0x0000000100003f92-0x0000000100003f93): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:15
[0x0000000100003f93-0x0000000100003f95): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:16
[0x0000000100003f95-0x0000000100003f9c): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:19
[0x0000000100003f9c-0x0000000100003f9d): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:22
[0x0000000100003f9d-0x0000000100003fa1): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:25
[0x0000000100003fa1-0x0000000100003fa7): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:26
[0x0000000100003fa7-0x0000000100003faa): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:29
[0x0000000100003faa-0x0000000100003fac): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:30
[0x0000000100003fac-0x0000000100003faf): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:33
[0x0000000100003faf-0x0000000100003fb6): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:34
[0x0000000100003fb6-0x0000000100003fb8): /Users/chris/Dev/assembly/learning-assembly/chapter11/factorial.s:35
(lldb)  

但单步编译时LLDB无法识别汇编源码的调试信息:

localhost % clang -g -o factorial factorial.s 
localhost % lldb factorial
(lldb) target create "factorial"
Current executable set to '/Users/chris/Dev/assembly/learning-assembly/chapter11/factorial' (x86_64).
(lldb) source info -f factorial.s
error: No source filenames matched 'factorial.s'.
(lldb) 

混合编译C与汇编源码时,LLDB仅能识别C文件的调试信息,汇编文件的调试信息同样丢失。

根本原因

分两步编译时,clang -g -c factorial.s会将-g参数传递给底层的汇编器(as),生成包含DWARF调试信息的目标文件;但单步编译时,Clang默认不会把-g传递给汇编器,导致汇编源码的调试信息未被嵌入最终可执行文件。

解决方案

通过-Wa,<选项>参数,直接向汇编器传递生成调试信息的指令。具体命令如下:

  1. 单步编译汇编文件:
clang -g -Wa,-gdwarf-4 -o factorial factorial.s

其中-gdwarf-4指定生成DWARF 4版本的调试信息,你可以根据需求替换为-gdwarf-5等对应版本。

  1. 混合编译C与汇编文件:
clang -g -Wa,-gdwarf-4 -o program main.c function.s

执行上述命令后,LLDB即可正常识别汇编源码的调试信息,使用source info -f factorial.s能输出正确的源码行与地址映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:15:37