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

如何获取从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=20
    
    其中malloc_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:28:08