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

开启-fsanitize=address时Clang编译程序触发段错误求助

排查Clang AddressSanitizer编译后程序空指针段错误的方向

问题背景

极简C++测试程序:

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;

    return 0;
}

常规编译命令可正常运行:

c++ -g -O1 -fno-omit-frame-pointer main.cpp -o main

添加AddressSanitizer编译后触发段错误:

c++ -g -O1 -fno-omit-frame-pointer -fsanitize=address main.cpp -o main

环境信息:

  • Clang版本:Ubuntu clang version 14.0.0-1ubuntu1.1
  • 标准库:libstdc++11(GLIBCXX_3.4.30、GLIBC_2.4)
  • strace显示崩溃原因:SIGSEGV (si_addr=NULL)

排查方向

  • 检查ASan运行时库是否安装:Ubuntu下Clang 14对应的ASan库是libasan6,执行dpkg -l | grep libasan确认是否安装,未安装则执行sudo apt install libasan6。
  • 直接运行程序查看ASan原生输出:strace可能会掩盖ASan的错误日志,直接执行./main,ASan通常会输出详细的崩溃调用栈,能定位到具体触发空指针的函数。
  • 手动指定链接ASan库:尝试在编译命令中显式添加-lasan,命令改为:
    c++ -g -O1 -fno-omit-frame-pointer -fsanitize=address -lasan main.cpp -o main
    
  • 切换到Clang自带的libc++编译:避免libstdc++与ASan的兼容性问题,编译命令改为:
    c++ -g -O1 -fno-omit-frame-pointer -fsanitize=address -stdlib=libc++ main.cpp -o main
    
  • 调整系统内存限制:ASan需要大量虚拟内存,执行ulimit -v unlimited解除虚拟内存限制后再运行程序。
  • 分析core文件定位崩溃点:用gdb加载core文件分析,执行gdb ./main core后输入bt查看完整调用栈,明确空指针操作发生在哪个环节。

内容的提问来源于stack exchange,提问作者huzzm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:16:11