如何获取从main函数开始的完整AddressSanitizer内存泄漏栈追踪?
解决LeakSanitizer栈追踪缺失main函数的问题
调整编译与运行参数
- 编译时明确指定
-g(Debug模式虽默认包含,但显式声明更可靠),完整编译命令示例:g++ -g -fsanitize=address -fno-optimize-sibling-calls -fno-omit-frame-pointer your_program.cpp -o your_program - 运行前设置ASAN环境变量,强制启用慢速且完整的栈展开,同时加深栈帧捕获深度:
其中export ASAN_OPTIONS=fast_unwind_on_malloc=0:malloc_context_size=20malloc_context_size可根据实际需求调整数值(如30),数值越大能捕获的栈帧层级越多。
升级工具版本
老旧版本的GCC/Clang或AddressSanitizer存在栈展开的兼容性bug,建议升级到GCC 10+、Clang 12+这类较新的稳定版本,新版本对栈追踪的完整性支持更好。
校验符号化工具匹配性
确认ASAN_SYMBOLIZER_PATH指向的符号化工具(如llvm-symbolizer或addr2line)与当前使用的编译器版本完全匹配,版本不匹配会导致符号解析不完整。可直接在运行命令前指定:
ASAN_SYMBOLIZER_PATH=/path/to/matching/llvm-symbolizer ./your_program
手动解析栈帧(备选方案)
若自动符号化仍无法得到完整栈链,可提取LeakSanitizer输出的原始内存地址,用addr2line手动解析:
addr2line -e your_program <内存地址>
对每个缺失的栈帧地址重复执行该命令,补全完整调用链。
内容的提问来源于stack exchange,提问作者SolidMechanicsFan
相关产品推荐
相关产品推荐

