Linux gcc自带检测内存泄漏工具asan

2023-05-16

背景

排查和检测内存泄漏的问题时,需要选择一些好用的工具,由于dmalloc编译复杂,valgrind依赖太多,所以选择使用gcc自带检测内存泄漏工具asan,版本4.8之后就支持asan了,下面来使用看下效果。

安装

安装gcc依赖的asan库:libasan.so

sudo yum install libasan

编译

编译参数:

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

此功能是运行的时候检测,且没有运行的代码是不能被检测到的。

代码

内存越界

int fun0(){
	char str[4] = {0,};
	strcpy(str,"测试");
	return 0;
}
=================================================================
==12724== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffe1ac0d566 at pc 0x4008d3 bp 0x7ffe1ac0d530 sp 0x7ffe1ac0d520
WRITE of size 1 at 0x7ffe1ac0d566 thread T0
    #0 0x4008d2 (/home/yubo.wang/4g-box/func-call/a.out+0x4008d2)
    #1 0x7f82632a9444 (/usr/lib64/libc-2.17.so+0x22444)
    #2 0x400931 (/home/yubo.wang/4g-box/func-call/a.out+0x400931)
Address 0x7ffe1ac0d566 is located at offset 38 in frame <main> of T0's stack:
  This frame has 1 object(s):
    [32, 36) 'str'
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
      (longjmp and C++ exceptions *are* supported)
Shadow bytes around the buggy address:
  0x100043579a50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579a60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x100043579aa0: 00 00 00 00 00 00 00 00 f1 f1 f1 f1[04]f4 f4 f4
  0x100043579ab0: f3 f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579ac0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579ad0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579ae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100043579af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:     fa
  Heap righ redzone:     fb
  Freed Heap region:     fd
  Stack left redzone:    f1
  Stack mid redzone:     f2
  Stack right redzone:   f3
  Stack partial redzone: f4
  Stack after return:    f5
  Stack use after scope: f8
  Global redzone:        f9
  Global init order:     f6
  Poisoned by user:      f7
  ASan internal:         fe
==12724== ABORTING

 内存泄漏

char *fun1(char *str) {
	static char *p;
	p = malloc(64);
	strcpy(p,str);
	return p;
}

int fun2(){
	char *str=fun1("abcd");
	printf("str=%s\n",str);
	return 0;
}

没有检测出内存泄漏的问题。

非法内存

int fun3(){
	char *p = NULL;
	strcpy(p,"a");
	return 0;
}
ASAN:SIGSEGV
=================================================================
==12787== ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x00000040081c sp 0x7ffc02097320 bp 0x7ffc02097320 T0)
AddressSanitizer can not provide additional info.
    #0 0x40081b (/home/yubo.wang/4g-box/func-call/a.out+0x40081b)
    #1 0x7f7be5ab3444 (/usr/lib64/libc-2.17.so+0x22444)
    #2 0x4008b1 (/home/yubo.wang/4g-box/func-call/a.out+0x4008b1)
==12787== ABORTING

总结

asan能够检测出内存越界和非法,但是对于malloc与free的匹配就不能检测到了。

如果需要使用交叉编译链编译的话,需要交叉工具链里面支持libasan.so库,一般高于4.8的版本都是自带这个库的,然后把这个动态库拷贝到开发板的lib目录下就可以了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux gcc自带检测内存泄漏工具asan 的相关文章

  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • GCC 如何运行其他程序?

    也许标题并没有那么准确地表达问题 我知道当我跑步时gcc foo cGCC 调用其他为其完成所有工作的子程序 使 gcc 主程序只是一个接口 但这到底是如何完成的呢 是否使用system or exec或者其他一些功能 我之所以想知道这个是
  • libstdc++新标准库功能支持表

    是否有一个表格指定新标准 11 和 14 支持previousGNU libstdc 的版本 我找到了这样的表compiler https gcc gnu org projects cxx0x html并为当前的库状态 https gcc
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 编译器如何如此好地优化这个阶乘函数?

    所以我一直在研究一些神奇的东西O3在 GCC 中 实际上我正在使用 Clang 进行编译 但这与 GCC 相同 我猜优化器的很大一部分是从 GCC 转移到 Clang 的 考虑这个 C 程序 int foo int n if n 0 ret
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • `cosf`、`sinf` 等不在 `std` 中 [重复]

    这个问题在这里已经有答案了 根据这里的讨论 我有报告了一个错误 https bugs launchpad net ubuntu source gcc 8 bug 1831385给 Ubuntu 开发者 编译以下示例 C 程序时 includ
  • 用于优化的编译器提示和语义[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我花了几周时间优化数值算法 通过预计算 内存对齐 编译器提示和标志以及反复试验的组合 我将运行时间缩短了一个数量级 我尚未使用内在函数
  • 为什么同一个curl命令在windows和linux下输出不同的东西?

    为什么同样的curl o file https www link com 命令输出不同的东西 例如 如果我运行命令curl o source txt https www youtube com playlist list PLIx6Fwnp
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • VINS-Mono 论文解读(IMU预积分残差+Marg边缘化)

    目录 VIO引出原因 xff1a 融合方案 xff1a 本文贡献 xff1a 0 总体框架 0 1 数据预处理 xff08 IMU预积分见标题1 xff09 0 2 初始化 A 滑动窗口 Sliding Window 纯视觉SfM B 视觉
  • 牛客网C++刷题要点

    1 虚函数 不要在构造函数和析构函数中调用虚函数 下面说说原理 xff1a 假如基类有个虚函数 那么编译器会为其创建虚函数表vtbl 并在对象的内存空间创建虚函数指针vptr 虚函数表的原理是每个类会在里面有自己的所能调用到的虚函数地址 对
  • 3D检测入门 - KITTI数据集

    参考链接 官网 xff1a http www cvlibs net datasets kitti index php 传感器介绍 xff1a http www cvlibs net datasets kitti setup php 相机内外
  • 请多多指教

    我是菜鸟 xff0c 还请各位大虾多多指教 xff01
  • VINS-DUAL 测试(小觅相机)

    设置小觅相机参数 直接从小觅相机内部获取各种参数 xff0c 把小觅相机给的SDK编译好后 xff0c 找到以下路径中生成的可执行文件 MYNT EYE D SDK samples output bin 直接执行下面两个文件 xff1a g
  • VINS-FUSION 研究日志 (3)进入 estimator.cpp Part A

    继续碎碎念梳理VINS FUSION 上一篇博文梳理了整个程序的入口 xff0c 其实只是做了传感器参数的读取与配置 xff0c 传感器测量数据的订阅 两件事情 estimator cpp 中有一个持续运行的线程 xff0c 是在 void
  • “Failed to get convolution algorithm. This is probably because cuDNN failed to initialize”错误的解决办法

    最近在使用TF2 0 运行程序出现以下错误 Failed to get convolution algorithm This is probably because cuDNN failed to initialize 一开始怀疑是CUDA
  • Linux多线程调用ubus导致死锁问题

    测试组发现用户进程在某种特定情况下 xff0c 会出现死锁 xff0c 现象是进程还在S状态 xff0c 但没有任何反应 xff0c 所以怀疑死锁 问题复现 通过几次测试发现 xff0c 进程中设置的参数恢复出厂后重启进程很大概率会出现死锁
  • Hi3559AV100 HDMI转MIPI-CSI LT6911UXC转换芯片调试

    Hi3559AV100项目 xff0c 需要接HDMI 4K摄像头 xff0c 需要把HDMI转成MIPI CSI信号接入CPU xff0c 从而实现信号的转换和实现 我们拿到的海思开发板是HI3559A4SDMEB VER A xff0c
  • 电脑抓wifi空中包三种方法

    WIN10电脑 下载wireshark软件 xff0c 设置WIFI网卡为monitor模式 xff1a C WINDOWS system32 gt cd Npcap C Windows System32 Npcap gt WlanHelp
  • 简述TCP的三次握手过程

    TCP握手协议 在TCP IP协议中 TCP协议提供可靠的连接服务 采用三次握手建立一个连接 第一次握手 xff1a 建立连接时 客户端发送syn包 syn 61 j 到服务器 并进入SYN SEND状态 等待服务器确认 xff1b SYN
  • buildroot使用外部编译链编译bluez蓝牙工具

    在开发ublox w263 wifi蓝牙时 xff0c 之前是使用yocto系统集成编译出的bluez工具 xff0c 减少了自己编译工具软件和依赖库的工作 xff0c 切换项目使用原生linux系统后 xff0c 所以的软件需要自己编译
  • 软件替代硬件HW_RANDOM随机数解决方案

    问题背景 使用低成本平台方案时 xff0c 发现不支持HW RANDOM硬件随机数 xff0c 这样在开启wifi wpa2加密ap后 xff0c 电脑多次提示连接失败才连接成功 xff0c 很影响用户体验 硬件不支持硬件随机数那么就需要使
  • Android下打印出现read: Unexpected EOF!分析

    背景 xff1a 在抓SmePlayer打印时 xff0c 打开debug级别后 xff0c xshell终端就嘟嘟响然后打印出几百行后就打出read Unexpected EOF 结束了 这时候完全没有抓到我需要的打印 xff0c 用lo
  • VMWare中处理器和内存配置含义

    背景 在创建虚拟机系统后 xff0c 默认处理器配置都是为1 xff0c 内存一般选为1G xff0c 然而在使用Linux系统编译大型软件时 xff0c 速度慢耗时较长 xff0c 这时候就需要调整一下处理器和内存配置 xff0c 使得计
  • Linux mkfs.ext4命令参数使用

    命令使用 mkfs ext4 参数 设备 参数说明 c 格式化前检查分区是否有坏块 Checking for bad blocks read only test 19 34 done 0 21 elapsed 0 0 0 errors Ch
  • Xshell 6多个会话窗口消失只能显示一个问题解决

    背景 某一天同事操作了我的Xshell导致我的会话窗口消失只能显示一个 xff0c 通过点击选项卡排列可以显示出消失的窗口 xff0c 但是使用极为不方便 xff0c 下面问题解决 解决 正常显示 xff1a 有三个选项窗口 异常显示 xf
  • OpenWrt学习(一)搭建Linux开发环境

    环境 目前大部分的 linux开发都是在PC虚拟机上进行的 xff0c 所采用的 linux系统版本有 Ubuntu Redhat Debian Fedora 等 xff0c 我们一般在 windows 操作系统上利用 VMware 43
  • OpenWrt学习(三)源码大包编译

    编译大包 make V 61 99 xff0c V 61 99 用来生成编译过程的详细信息 xff0c 方便查找出错原因 xff0c 或者用V 61 s 建议加 j x xff08 x 为CPU core数量 xff09 选项 xff0c
  • Linux gcc自带检测内存泄漏工具asan

    背景 排查和检测内存泄漏的问题时 xff0c 需要选择一些好用的工具 xff0c 由于dmalloc编译复杂 xff0c valgrind依赖太多 xff0c 所以选择使用gcc自带检测内存泄漏工具asan xff0c 版本4 8之后就支持