硬核课堂
飞书用户7775
添加快捷方式
分享
C++内存杀手锏ASAN分享
输入“/”快速插入内容
C++内存杀手锏ASAN分享
1.背景
写过C++的人都知道,内存管理一直是很头疼的问题。有时候你的程序core了天际,而你却无可奈何,特别是你的服务代码量很大时候,根本无从下手,可能单纯的排查问题都会一周以上。因此我们在存量的基础上,更优雅的方式是借助工具来辅助我们快速定位到问题。
谷歌有一系列Sanitizer官网见
https://github.com/google/sanitizers
,可以用于定位程序中的系列问题,常用的Sanitizer包括
•
Address Sanitizer(ASan):用于检测内存使用错误
•
Leak Sanitizer(LSan):用于检测内存泄漏
•
Thread Sanitizer(TSan):用于检测多线程间的数据竞争和死锁
•
Memory Sanitizer(MSan):用于检测使用未初始化内存的行为
本次主要分享的是ASan的使用。
2.ASAN工具
2.1asan简介
ASan 是
Address Sanitizer
简称,它是
一种基于编译器用于快速检测原生代码中内存错误的工具
。
简而言之,ASan 就是一个用于快速检测内存错误的工具,目前已经集成在LLVM 3.1+和GCC 4.8+中
2.2asan能做什么
ASan可以检测出程序中不合理的内存使用行为,主要包括以下行为
2.3asan怎么做到的
在编译时,ASan会替换malloc/free接口
在程序申请内存时,ASan会额外分配一部分内存来标识该内存的状态
在程序使用内存时,ASan会额外进行判断,确认该内存是否可以被访问,并在访问异常时输出错误信息
详细的工作原理有兴趣可以参考官方文档:
https://github.com/google/sanitizers/wiki/AddressSanitizerAlgorithm
2.4如何使用
2.4.1安装
1.
centos下使用:yum install libasan -y
2.
需要llvm-symbolizer做符号解析,否则输入错误信息只有地址信息没有符号信息:yum install -y llvm,检查时候which llvm
2.4.2编译设置
编译选项
在CMakeList.txt中添加如下编译选项
🦄
add_compile_options(-O0 -ggdb -std=c++14 -Wall -Wextra -mavx2
-fsanitize=address
-fno-omit-frame-pointer
-fno-optimize-sibling-calls
-fsanitize-address-use-after-scope
-fsanitize-recover=address)