Linux 下剥离debug信息

        首先编译时加了-g,想要发布两个文件,一个不带debug的信息的程序文件,一个是只带debug信息的符号文件。

1,先将原程序拷贝一份,命令为xxx.sym

cp myapp myapp_symbol.sym

2,将原文件myapp 剥离掉debug信息

strip --strip-debug --strip-unneeded myapp

3,将myapp_symbol.sym 剥离掉其他,只留debug 信息

strip --only-keep-debug cips_symbol.sym

可以用 readelf -S xx | grep .debug 查看是否有debug 信息。

GDB 调试时,用 symbol-file 加载符号文件,没有加载符号时,打的断点无法显示文件信息:

加载符号后,可显示断点的文件信息:

<think>嗯,用户问的是如何在LLVM 15中生成或获取调试信息的方法或配置。我需要先回忆一下LLVM相关的调试信息生成步骤。根据之前的引用,特别是引用[1]和[2],调试信息需要在编译LLVM时使用Debug版本,但用户现在可能更关注如何在自己的项目中使用LLVM 15来生成调试信息,而不仅仅是构建LLVM本身。 首先,用户可能需要的是在编译自己的代码时,通过Clang或其他前端工具生成调试信息。这时候需要检查编译选项,比如Clang的-g选项。不过LLVM中间表示(IR)中的调试信息可能需要特定的参数,比如-g或-gline-tables-only。另外,可能需要确保优化过程中保留调试信息,比如使用-Og或者在优化标志后加上-g。 然后,想到LLVM的Pass调试可能需要Debug版本的LLVM,但用户的问题可能更偏向于生成调试信息而不是调试LLVM本身。根据引用[2],Release版本的LLVM也可以调试自定义的Pass,但如果是需要LLVM内部的调试信息,可能需要Debug构建。不过用户的问题更多是关于生成调试信息,所以可能需要指导如何在使用LLVM工具链时保留调试符号。 另外,用户可能需要知道如何验证调试信息是否生成,比如使用llvm-dwarfdump或者objdump等工具来检查生成的DWARF信息。还有链接时的注意事项,比如确保链接器不剥离调试信息,可能需要使用-Wl,--emit-relocs或者相关的链接选项。 可能还需要提到不同平台(如Linux、Windows)下的差异,比如Windows的PDB文件,但用户没有指定系统,可能需要保持通用。此外,LLVM 15是否有新特性或改动,比如调试信息的生成方式是否有变化,可能需要查阅LLVM 15的文档,但根据现有知识,基本流程应该和之前版本类似。 总结一下,步骤应该是:1. 编译时添加调试选项;2. 链接时保留调试信息;3. 验证调试信息的存在;4. 调试信息相关的Pass配置(如果有的话)。同时需要引用之前的参考资料,比如引用[1]和[2]提到的Debug版本LLVM的构建,但用户的问题可能更多是应用层面的配置,所以重点放在编译和链接选项上。</think>在LLVM 15中配置调试信息的生成需要从编译工具链、优化选项和调试符号保留三个方面进行设置,以下是具体步骤: ### 一、编译阶段启用调试信息 1. **Clang前端添加调试标志** 使用Clang编译源代码时,通过`-g`选项生成DWARF格式调试信息: ```bash clang -g -O0 -emit-llvm -c example.c -o example.bc ``` - `-g`:生成完整调试信息 - `-O0`:禁用优化以避免调试信息被简化[^1] - `-gline-tables-only`:仅保留行号信息以减小体积 2. **LLVM IR中保留调试元数据** 通过`-debugify`测试Pass可验证调试信息完整性: ```bash opt -verify-debuginfo -debugify example.bc -o example_verified.bc ``` ### 二、链接阶段保留调试信息 1. **链接器配置** 使用`lld`链接器时需添加以下选项: ```bash ld.lld --emit-relocs --keep-debug example.o -o executable ``` - `--emit-relocs`:保留重定位信息 - `--keep-debug`:禁止剥离调试段[^2] ### 三、调试信息验证工具 1. **检查DWARF信息** ```bash llvm-dwarfdump executable > debuginfo.txt ``` 查看输出文件中是否包含`.debug_info`和`.debug_line`段 2. **反汇编验证** ```bash llvm-objdump -S --dwarf=info executable ``` ### 四、LLVM Pass开发注意事项 1. **优化Pass配置** 在自定义Pass中通过`preserveAnalysis()`方法保留调试信息: ```cpp void MyPass::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesCFG(); AU.addPreserved<DominatorTreeWrapperPass>(); AU.addPreserved<LoopInfoWrapperPass>(); } ``` 2. **调试符号与优化的兼容性** LLVM 15支持在`-O2`优化级别下通过`-fno-optimize-sibling-calls`保留调用栈信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值