为何单步编译链接汇编源码会丢失调试信息?
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,<选项>参数,直接向汇编器传递生成调试信息的指令。具体命令如下:
- 单步编译汇编文件:
clang -g -Wa,-gdwarf-4 -o factorial factorial.s
其中-gdwarf-4指定生成DWARF 4版本的调试信息,你可以根据需求替换为-gdwarf-5等对应版本。
- 混合编译C与汇编文件:
clang -g -Wa,-gdwarf-4 -o program main.c function.s
执行上述命令后,LLDB即可正常识别汇编源码的调试信息,使用source info -f factorial.s能输出正确的源码行与地址映射。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

