• 内存错误分析工具----asan(AddressSanitizer)的介绍和使用


    目录

    1 ASAN介绍

    2 使用前提

    2.1 gcc版本大于4.8

     2.2 系统中有asan

    3 使用方法

    3.1 makefile中增加编译选项-fsanitize=address -g

    3.2 makefile中链接libasan.so库

    3.3 export选项

    4 编译运行可执行程序


    在项目中遇到了一个内存泄漏的问题,最开始用valgrind工具分析,后来发现valgrind不太好用,没能找到原因,后来用asan找到了内存泄漏的点,问题解决写篇博客记录下asan工具的使用,供以后使用。

    1 ASAN介绍

    ASAN,全称 AddressSanitizer,也即地址消毒技术。可以用来检测内存问题,例如缓冲区溢出或对悬空指针的非法访问等。根据谷歌的工程师介绍 ASAN 已经在 chromium 项目上检测出了300多个潜在的未知bug,而且在使用 ASAN 作为内存错误检测工具对程序性能损耗也是及其可观的。根据检测结果显示可能导致性能降低2倍左右,比Valgrind(官方给的数据大概是降低10-50倍)快了一个数量级。而且相比于Valgrind只能检查到堆内存的越界访问和悬空指针的访问,ASAN 不仅可以检测到堆内存的越界和悬空指针的访问,还能检测到栈和全局对象的越界访问。这也是 ASAN 在众多内存检测工具的比较上出类拔萃的重要原因,基本上现在 C/C++ 项目都会使用ASAN来保证产品质量,尤其是大项目中更为需要。

    2 使用前提

    2.1 gcc版本大于4.8

    再网上看到说gcc版本大于4.8才可以用asan,我的gcc满足该要求

     2.2 系统中有asan

     我在板子上搜索了一下,发现是存在这个库的。

    3 使用方法

    3.1 makefile中增加编译选项-fsanitize=address -g

    CFLAGS  += $(foreach dir, $(INCLUDE_PATH), -I$(dir))  -fvisibility=hidden  -fsanitize=address -g

    上面的编译选项,前面的是本来就有的,后面的-fsanitize=address -g后来新加的。

    3.2 makefile中链接libasan.so库

    -lasan

    3.3 export选项

    ASAN_OPTIONS是Address-Sanitizier的运行选项环境变量。

    # halt_on_error=0:检测内存错误后继续运行

    # detect_leaks=1:使能内存泄露检测

    # malloc_context_size=15:内存错误发生时,显示的调用栈层数为15

    # log_path=/home/xos/asan.log:内存检查问题日志存放文件路径

    # suppressions=$SUPP_FILE:屏蔽打印某些内存错误

    除了上述常用选项,以下还有一些选项可根据实际需要添加:

    # detect_stack_use_after_return=1:检查访问指向已被释放的栈空间

    # handle_segv=1:处理段错误;也可以添加handle_sigill=1处理SIGILL信号

    # quarantine_size=4194304:内存cache可缓存free内存大小4M

    我这里使用的是

    export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:malloc_context_size=15:log_path=./asan.log

    4 编译运行可执行程序

     这里需要注意,只有可执行程序正常执行完才能有log文件,如果是自己ctrl+c中断程序或者程序报错异常退出,都不会有log文件。

    程序执行完之后产生的log文件如下所示,我摘抄一部分

     log里面还会帮你行出错的行号也写上,我这里是在push_back那里有错误。

  • 相关阅读:
    软件工程和计算机科学与技术学习方向区别
    计算机视觉(CV)技术
    打印剪刀手“耶”(V形)
    soildworks2022如何快速更改草图基准面?
    用于时间触发的嵌入式软件的IDE
    Halcon Camera-calibration 相关算子(二)
    python四大数据类型——python筑基系列
    Jmeter项目实战
    【实践篇】Redis使用规范清单详解
    pytorch 数据的读取
  • 原文地址:https://blog.csdn.net/u013171226/article/details/126876335