转自:http://shafeng.github.io/2017/05/10/asan/

最近线上的程序总是莫名其妙崩溃,因为我们的项目使用了分布负载的机制,对于玩家的影响其实很小,但是我肯定是忍不了的…程序崩溃的core文件里面完全找不到问题所在,初步分析应该是野指针导致,仔细分析程序之后并没有发现内存释放后没有置null的情况,很可能是多线程导致的,然而代码量太大,大海捞针实在是无法找到问题所在,所以我找到了asan,项目之前一直用gcc4.4编译,完全不知道asan的存在,asan是gcc4.8以上gcc自带的内存检测库,开发自google,在gcc4.8版本以上编译链接的时候加入指定的参数即可,非常的方便好用,而且对程序的性能影响并不大,如果你的程序平时耗费的cpu和内存资源不超过50%,那么完全可以把加入asan的程序放到线上去跑.

首先在编译机上升级gcc,我直接升级到了最新版本gcc6.3版本(写这篇记录的时候最新版已经到gcc7.1了),升级后系统库中会新加入libasan,我们使用asan的功能都是来自于这里.
然后对代码进行编译和链接,编译时使用 -g -O2 -fsanitize=address -fno-omit-frame-pointer .-fsanitize=address命令就是将asan编译进来,这样编译的.o文件在运行时stack上申请的内存都会被asan接管,如果出问题asan会第一时间输出报告,如内存越界和各种非法访问. -fno-omit-frame-pointer可以防止一些优化导致指针丧失可读性. 链接时使用-fsanitize=address -fno-omit-frame-pointer选项可以让程序在heap上申请的内存被asan接管,这样asan会监控new和delete来输出内存泄漏的报告.

大功告成,使用asan编译和链接的程序生成好之后放到了线上环境运营,很快出现了一次宕机,asan会直接把自己的输出当做error输出,你可以查看到当前导致宕机的内存位置和变量名,文件行数,变量来源,线程信息等等非常全面的信息,得到这些信息后很快就分析出原来崩溃来自一个多线程共享的模块,而当前模块在多线程竞争资源的地方没有加锁,导致同一块内存被写坏. 问题完美解决,程序再也不会宕机了.

总结一下,asan在检测程序内存方面的功能实在是强大,之前也用过valgrind来检查内存泄漏,但是valgrind对性能的影响实在是太大,完全不能放到线上环境这样真实的环境下测试,而且asan给出的问题报告相当详细,基本上看一次错误报告就能解决当前导致宕机的问题,而core文件的信息由于优化和其他程序上下文的差异会导致提供的信息基本上没什么作用.宕机十次,十个core文件也无法准确定位某些野指针错误的问题.对于asan,只有一个词能表达我的心情,那就是相见恨晚…asan你值得拥有,谁用谁知道.

ASan(Linux),gcc4.8以上版本自带的内存检查工具相关推荐

  1. linux valgrind memCheck ---内存检查工具的可视化方法valkyrie

    linux valgrind memCheck -内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1.安装valgrind valgrind 安 ...

  2. Java 技术篇-用java自带的内存检测工具排查内存泄漏问题,查看java垃圾回收情况,监控java堆内存变化

    在 java 的 bin 文件夹下有个 jvisualvm.exe 工具,使用它可以检测到 java堆内存 的变化情况,借此可以来检测使用 java 的程序是否存在内存泄漏问题. 我们左边选择程序对应 ...

  3. linux valgrind Memcheck--内存检查工具

    linux valgrind Memcheck–内存检查工具 使用方法: 注意,这里要用debug版本,如果是release的运行文件,则用debug编译出来的可执行文件替换 输出到终端: valgr ...

  4. linux c 内存泄露 检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄漏,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  5. Linux下几款C++程序中的内存泄露检查工具

    Linux下编写C或者C++程序,有很多工具,但是主要编译器仍然是gcc和g++.最近用到STL中的List编程,为了检测写的代码是否会发现内存泄露,了解了一下相关的知识. 所有使用动态内存分配(dy ...

  6. Linux环境下多线程C/C++程序的内存问题诊断

    目录 说明 常见的内存错误举例 常见的内存访问错误有以下几种: 内存问题定位步骤 野指针 内存释放后使用(UaF,Use after Free) 内存问题检查工具 常见的内存问题检查工具 Valgri ...

  7. linux下升级g 版本,linux下升级gcc版本(gcc-7)

    ubuntu16.04的自带gcc版本为gcc-5,因为安装pl-slam的需要升级到gcc-7,可以通过以下命令查看你的gcc版本 gcc --version 通过apt工具对gcc进行升级 sud ...

  8. linux下载哪个python版本-Linux下切换Python版本的几种方法

    本篇博文面向Linux用户,在Ubuntu下测试通过 0 为什么需要有两个版本的Python Python2和Python3不兼容是每个接触过Python的开发者都知道的事,虽说Python3是未来, ...

  9. linux旧版本如何升级成新版本,Linux如何升级软件版本,

    Linux如何升级软件版本, 简介 在使用Linux的时候,安装软件一般有几种:系统包管理器安装.源码编译.二进制包,还有现在桌面系统用比较多的Snap.AppImage.Flatpak等. 升级 由 ...

最新文章

  1. 性能测试之LoardRunner 测试场景监控关注的几点
  2. Qt 从C ++定义QML类型(二)
  3. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
  4. Ubuntu彻底删除MySQL重装MySQL
  5. 爬虫数据executemany插入_金融数据的获取——一个爬虫的简单例子
  6. 2021百度职业教育行业洞察
  7. win7屏保时间设置_论如何优雅的设置手机和电脑时间屏保!
  8. Centos6.x X64 飞信安装
  9. Tcl Tutorial 笔记3 ·math
  10. 悟透JavaScript--可爱与智慧并存,灵感与诙谐共生
  11. JavaScript闭包函数的理解
  12. html5注册页面样式,HTML5一款小清新风格的登录/注册表单界面模板
  13. 【Genotype(基因串) 玩具取名】题解
  14. 微信语音技术原理_玩人工智能的你必须知道的语音识别技术原理
  15. 解决vmware不能上网的问题
  16. Python爬虫进阶之爬取篮球赛数据
  17. Photoshop——多变量+文字数据组替换+批处理详细操作
  18. 水平拆分 垂直拆分 分表 什么意思
  19. 人工智能:语音识别技术介绍
  20. 通过图形界面对MySQL数据库进行操作

热门文章

  1. img 在video上面_HTML,img,video无法铺满屏幕解决方法,同视频做网页背景无法全屏的解决方法...
  2. 正则 不区分大小写_为什么要学正则表达式 7
  3. android读取工程目录下的文件,Android编程实现读取工程中的txt文件功能
  4. java thread isalive,《Java多线程编程核心技术(第2版)》 —1.4 isAlive()方法
  5. 服务器开机只显示cdm,电脑开机黑屏出现cdm.exe对话框怎么处理?!我的扣扣
  6. Python,C++中点云 .las转.pcd
  7. PCL:k-d tree 1 讲解
  8. GitHub上共享的简单易用 TensorFlow 代码集
  9. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶
  10. 【OpenCV】将单通道的Mat对象转换为三通道的Mat