码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 内存错误分析工具----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那里有错误。

  • 相关阅读:
    静态WEB容器镜像最小化实践
    Error contacting service. It is probably not running.问题解决
    腾讯安全发布《BOT管理白皮书》|解读BOT攻击,探索防护之道
    解决SpringBoot 中Controller层加入RequestMapping导致HTML页面的静态文件路径变化问题
    springcloud:1.Eureka详细讲解
    【AI视野·今日Robot 机器人论文速览 第六十一期】Tue, 24 Oct 2023
    vue3导出表格(导出成Execl表)
    【问题解决】我遇到并解决PlatformIO无法使用的各种问题汇总及解决方法,简单粗暴使用的网络问题解决方法...
    【嵌入式学习】--Uart串口
    ExpertPrompting:指导大语言模型成为杰出专家
  • 原文地址:https://blog.csdn.net/u013171226/article/details/126876335
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号