学无先后,达者为师

网站首页 编程语言 正文

AddressSanitizer 查找内存问题

作者:newrtc 更新时间: 2023-10-15 编程语言

服务器开发,有些时候遇到很奇怪的问题,可能运行几个周会出现一次异常,有些内存问题可以借助AddressSanitizer 定位

centos g++版本切换

https://blog.csdn.net/liuhongxiangm/article/details/124129742
这个方法只是临时生效
我是在.bashrc里加了

source /opt/rh/devtoolset-10/enable

AddressSanitizer

AddressSanitizer 是一个性能非常好的C/C++ 内存错误探测工具。
它由编译器的插桩模块和替换了malloc函数的运行时库组成。
这个工具可以探测如下这些类型的错误:

  • 对堆、栈和全局内存的访问越界(堆缓冲区溢出,栈缓冲区溢出,和全局缓冲区溢出)
  • UAP(Use-after-free,悬挂指针的解引用,或者说野指针)
  • Use-after-return(无效的栈上内存,运行时标记 ASAN_OPTIONS=detect_stack_use_after_return=1)
  • Use-After-Scope (作用域外访问,clang标记-fsanitize-address-use-after-scope)
  • 内存的重复释放 (double-free)
  • 初始化顺序的BUG
  • 内存泄漏 (memory leak)

使用

1、以CentOS7环境下编译器gcc 10为例 (版本支持: gcc version > 4.8)
下载地址:
https://centos.pkgs.org/7/centos-sclo-rh-x86_64/
https://centos.pkgs.org/7/centos-sclo-rh-x86_64/devtoolset-10-libasan-devel-10.2.1-11.2.el7.x86_64.rpm.html
或者

yum install centos-release-scl-rh
yum install devtoolset-10-libasan-devel

这个要和gcc 版本对应
2、编译源码的时候只需要加上以下编译参数即可:

-fsanitize=address -fno-omit-frame-pointer -g

链接库:-lasan

项目经验

  • 项目的构建方案应当有编译选项可以随时启用/关闭ASAN
  • 项目送测阶段可以打开ASAN以帮助暴露更多的低概率诡异问题
  • 请勿在生产版本中启用ASAN, 其会降低程序运行速度大概2-5倍 (特殊情况除外)
  • 实际开发测试过程中通过ASAN扫出的常见问题有:
  • 多线程下临界资源未加保护导致同时出现读写访问, 解决方案一般是对该资源恰当地加锁即可
  • 内存越界, 如申请了N字节的内存却向其内存地址拷贝大于N字节的数据, 这种情况在没有开启ASAN的情况下一般都很难发现

原文链接:https://newrtc.blog.csdn.net/article/details/124426529

  • 上一篇:没有了
  • 下一篇:没有了
栏目分类
最近更新