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手册

猜你喜欢

转载自blog.csdn.net/lianshaohua/article/details/109156485