简介
https://zhuanlan.zhihu.com/p/360135083
使用方式
添加编译选项
-Lasan -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer
编写代码文件,如添加test_asan.c
#include<stdio.h>
#include<stdlib.h>
int main(){
//未释放的内存,会产生内存泄漏
int* arr = (int*)malloc(sizeof(int) * 10);
return 0;
}
1.gcc添加方式
gcc -g test_asan.c -o t1 -Lasan -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer
2.CMakeLists添加方式
cmake_minimum_required(VERSION 2.8)
project(test C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Lasan -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer")
add_executable(t1 test_asan.c)
ps:一般需要添加-g,否则仅仅会输出错误,找不到对应函数与行号。
重新编译生成可执行文件
查找动态库位置
find /usr -name 'libasan.so'
#/usr里面没有也可以全局查找或自行安装
find / -name 'libasan.so'
#输出位置如下
/usr/local/lib64/libasan.so
添加动态库
export LD_PRELOAD=/usr/local/lib64/libasan.so
执行程序,可以看到内存泄漏问题并定位
./t1
=================================================================
==2154==ERROR: LeakSanitizer: detected memory leak
内存泄漏工具asan的使用与常见错误

本文介绍了如何使用AddressSanitizer(ASan)工具来检测C/C++程序中的内存泄漏、栈溢出和堆溢出等错误。通过在编译时添加特定选项,可以启用ASan并在运行时报告内存问题。文章提供了示例代码和错误输出,帮助开发者理解和定位内存相关问题。
最低0.47元/天 解锁文章
1859

被折叠的 条评论
为什么被折叠?



