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 的相关文章

  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • 如何在 Linux 中重新添加 unicode 字节顺序标记?

    我有一个相当大的 SQL 文件 它以 FFFE 的字节顺序标记开头 我使用 unicode 感知的 linux 分割工具将此文件分割成 100 000 行块 但是当将这些传递回窗口时 它确实not与第一个部分以外的任何部分一样 只是它具有
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • 裸机交叉编译器输入

    裸机交叉编译器的输入限制是什么 比如它不编译带有指针或 malloc 的程序 或者任何需要比底层硬件更多的东西 以及如何才能找到这些限制 我还想问 我为目标 mips 构建了一个交叉编译器 我需要使用这个交叉编译器创建一个 mips 可执行
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

    在一台 GNU Linux 机器上 如果想要执行 实时 亚毫秒级时间关键 任务 您几乎总是必须经历漫长 复杂且容易出现问题的内核补丁过程 以提供足够的支持 1 http en wikipedia org wiki RTLinux Backg
  • Visual Studio - X11:缺少 DISPLAY 环境变量

    我正在使用 Visual Studio 2019 Enterprise 开发跨平台 Windows Linux x64 GUI 应用程序 在这个 2019 版本中 我们可以使用 Visual Studio调试平台 Windows 本机 和
  • 了解 Linux oom-killer 日志

    我的应用程序被 oom killer 杀死了 它是在实时 USB 上运行的 Ubuntu 11 10 无需交换 PC 具有 1 Gig 的 RAM 唯一运行的应用程序 除了所有内置的 Ubuntu 东西 是我的程序 flasherav 请注
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • Apache LOG:子进程 pid xxxx 退出信号分段错误 (11)

    Apache PHP Mysql Linux 注意 子进程 pid 23145 退出信号分段错误 11 tmp 中可能存在 coredump 但 tmp下没有找到任何东西 我怎样才能找到错误 PHP 代码中函数的无限循环导致了此错误
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出

随机推荐

  • 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之后就支持