Linux调试内存泄漏的工具——AddressSanitizer(ASan)-爱代码爱编程
以前,我们调试内存泄漏,可能会使用下面的一种或几种工具:
-
valgrind
-
mtrace
-
dmalloc
-
ccmalloc
-
memwatch
-
debug_new
上面的工具,我也曾经使用过,这次介绍一个新的工具——AddressSanitizer(ASan)。该工具为gcc自带,4.8以上版本都可以使用,支持Linux、OS X、ios、freeBSD、Android等多种平台,不止可以检测内存泄漏,它其实是一个内存错误检测工具,可以检测的问题主要有:
- 内存泄漏
- 堆栈和全局内存越界访问
- free后继续使用
- 局部内存被外层使用
- 初始化列表顺序错误
使用上也非常简单,只需要在编译的时候增加参数:-fasanitize=address -g即可,下面通过几个例子来简简的学习一下:
1、内存泄漏的定位:
main.cpp代码:
#include <iostream>
#include <memory>
using namespace std;
int main(int argc, char *argv[])
{
int *pa=new int(10);
cout<<*pa<<endl;
return 0;
}
编译并执行:g++ -Wall -g -fsanitize=address main.cpp -o main && ./main
执行结果:
结果一目了然,不做进一步分析了。
2、访问越界的定位
main.cpp代码:
#include <iostream>
#include <memory>
using namespace std;
int main(int argc, char *argv[])
{
int arr[100];
arr[0]=10;
arr[100]=0xff;
for(auto &item:arr)
{
cout<<item<<endl;
}
return 0;
}
编译并执行:g++ -Wall -g -fsanitize=address main.cpp -o main && ./main
执行结果:
其他的检测与上面的并无什么太大差异,总之,使用起来更简单了,-fsanitize的选项及意义如下:
更详细的资料请参见:https://github.com/google/sanitizers/wiki/AddressSanitizer或man gcc手册
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/lianshaohua/article/details/109156485