如何在ThreadSanitizer(TSan)堆栈跟踪中查找对应代码行号
TSan栈回溯无行号问题解决方案
核心原因
TSan输出行号依赖额外的符号解析工具和完整的调试信息,当前无行号问题通常由符号解析工具缺失、调试信息被优化/裁剪两种原因导致,可按以下步骤排查解决:
- 安装正确版本的符号解析工具
TSan默认调用llvm-symbolizer完成地址到代码行号的转换,你需要安装和所用Clang版本匹配的llvm-symbolizer包,比如Clang 15对应安装llvm-15-symbolizer。可以通过以下两种方式指定工具路径:- 做软链接:
ln -s /usr/lib/llvm-15/bin/llvm-symbolizer /usr/bin/llvm-symbolizer - 运行程序前指定环境变量:
export TSAN_SYMBOLIZER_PATH=/usr/lib/llvm-15/bin/llvm-symbolizer
- 做软链接:
- 调整编译链接选项
除了你已经添加的-g3、-O1参数外,额外添加-fno-omit-frame-pointer参数,避免帧指针被优化导致栈回溯失败。同时链接阶段禁止添加任何裁剪符号的参数(包括-s),也不要在编译完成后手动strip二进制文件。 - 降低优化等级验证
如果调整后仍无行号,可以将-O1替换为-O0测试,部分架构下的O1优化可能会打乱调试信息和执行指令的对应关系,O0等级下可以先验证行号输出是否正常。 - 手动解析地址
上述步骤都无效的情况下可以手动解析栈地址,从TSan的输出中提取对应指令的十六进制地址,用llvm-symbolizer直接解析:
示例命令:llvm-symbolizer -e 你的二进制文件路径 指令地址,执行后会直接返回对应代码文件路径和行号。
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

