内存泄漏检测方式

一 、 日志记录

        通过宏定义重载了 mallocfree 函数,以在分配和释放内存的时候记录一些信息,包括文件名和行号,并将这些信息写入到相应的文件中。然后在 main 函数中演示了使用这些宏进行内存分配和释放。

  1. _malloc 函数:

    • 在分配内存之后,创建一个文件名,其中包含了分配的内存地址(以16进制表示)。
    • 打开这个文件并写入一些信息,包括源文件名、行号、分配的内存地址和大小。
    • 关闭文件并返回分配的内存地址。
  2. _free 函数:

    • 根据释放的内存地址创建相应的文件名。
    • 尝试删除这个文件,如果删除成功则表示释放成功,否则可能是发生了双重释放(double free)。
    • 调用标准库的 free 函数释放内存。
  3. malloc 宏和 free 宏:

    • 利用宏定义将 mallocfree 分别重命名为 _malloc_free,并且在这两个宏中传递 __FILE____LINE__,使得每次分配和释放内存都可以记录相应的文件名和行号。
#define _GNU_SOURCE
#include <dlfcn.h>#include <stdio.h>
#include <stdlib.h>#include <unistd.h>#if 0void *_malloc(size_t size, const char *file, int line) {void *p = malloc(size);char buff[128] = {0};sprintf(buff, "./mem/%p.mem", p);FILE *fp = fopen(buff, "w");fprintf(fp, "[+%s:%d] --> addr:%p, size:%ld\n", file, line, p, size);fflush(fp);fclose(fp);return p;
}void _free(void *p, const char *file, int line) {char buff[128] = {0};sprintf(buff, "./mem/%p.mem", p);if (unlink(buff) < 0) { // double freeprintf("double free: %p\n", p);return ;}free(p);}#define malloc(size) _malloc(size, __FILE__, __LINE__)
#define free(p)		 _free(p, __FILE__, __LINE__)#endifint main() {//	DEBUG_MEM_LEAKvoid *p1 = malloc(10);void *p2 = malloc(20);free(p1);}

二、  日志记录2

        这段代码使用了动态链接库劫持的方法,通过重载 mallocfree 函数,实现了在内存分配和释放时记录信息的功能。以下是代码的解释:

typedef void *(*malloc_t)(size_t size);
malloc_t malloc_f = NULL;typedef void (*free_t)(void *p);
free_t free_f = NULL;int enable_malloc_hook = 1;
int enable_free_hook = 1;// main --> f --> func --> malloc();void *malloc(size_t size) {if (enable_malloc_hook) {enable_malloc_hook = 0;//void *p = malloc_f(size);void *caller = __builtin_return_address(0);char buff[128] = {0};sprintf(buff, "./mem/%p.mem", p);FILE *fp = fopen(buff, "w");fprintf(fp, "[+%p] --> addr:%p, size:%ld\n", caller, p, size);fflush(fp);enable_malloc_hook = 1;return p;}  else {return malloc_f(size);}}void free(void *p) {if (enable_free_hook) {char buff[128] = {0};sprintf(buff, "./mem/%p.mem", p);if (unlink(buff) < 0) { // double freeprintf("double free: %p\n", p);return ;}free_f(p);} else {free_f(p);}}//hook//dlsymvoid init_hook(void) {if (malloc_f == NULL)malloc_f = dlsym(RTLD_NEXT, "malloc");if (free_f == NULL)free_f = dlsym(RTLD_NEXT, "free");}#define DEBUG_MEM_LEAK		init_hook();int main() {DEBUG_MEM_LEAKvoid *p1 = malloc(10);void *p2 = malloc(20);free(p1);}

三、bpftrace

        创建mem.bt文件

        uprobe挂在的事件和点,然后过滤当前进程等于memleak

        这个脚本的目的是监测在进程名为 "memleak" 的情况下,libc 库中的 mallocfree 函数的调用,并在每次调用时输出相应的信息。请确保你的系统支持 BPF 功能,并且相关的 uprobes 事件能够被监测。此外,记得在 bpftrace 执行时使用 sudo 权限,因为 uprobes 需要 root 权限。        

uprobe:/lib/x86_64-linux-gnu/libc.so.6:malloc
/comm == "memleak"/
{printf("malloc\n"); 
}uprobe:/lib/x86_64-linux-gnu/libc.so.6:free
/comm == "memleak"/
{printf("free\n"); 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/239219.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 下查找头文件和库的顺序

Linux 下查找头文件和库的顺序 C语言 — 动态库的两种使用方式说明_动态库的两种调用方式-CSDN博客 linux动态链接库的加载顺序_动态链接库顺序-CSDN博客 几个链接选项 -I 指定头文件搜索目录-L 指定静态库文件搜索目录-Wl,-R&#xff08;或-Wl,-rpath&#xff09; 指定动态库…

​LeetCode解法汇总83. 删除排序链表中的重复元素

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定一个已排序的链表的头 head &#xf…

flash-attn库安装记录

flash-attn库安装记录 第一步&#xff1a; 安装好cuda11.7 第二步&#xff1a; 使用代码export CUDA_HOME/usr/local/cuda-11.7让库找到cuda路径 第三步&#xff1a; 使用pip install flash-attn --no-build-isolation安装 安装成功显示

主流浏览器设置代理IP之搜狗浏览器

给浏览器设置代理IP是目前代理IP的主流使用场景之一&#xff0c;接下来小编就手把手教你如何对搜狗浏览器进行代理IP设置 注&#xff1a;本次使用IP来源于携趣代理平台 搜狗浏览器内设置IP代理 1、首先需要进入浏览器【设置】 2.点击【代理设置】选择【代理服务器设置】然后进…

【SpringBoot3】Spring Boot 3.0 介绍以及新特性

文章目录 一、Spring Boot 3.01、介绍2、Spring Boot 核心概念3、Spring Boot 3.0 新特性 二、Spring Boot Starter1、介绍2、Starter 命名规则3、官方提供了哪些Starter 三、spring-boot-starter-parent 说明四、示例&#xff1a;创建web项目参考 一、Spring Boot 3.0 1、介绍…

3.3.3 使用集线器的星形拓扑

3.3.3 使用集线器的星形拓扑 集线器的一些特点 3.3.4 以太网的信道利用率 多个站在以太网上同时工作就可能会发生碰撞当发生碰撞时&#xff0c;信道资源实际上是被浪费了。因此&#xff0c;当扣除碰撞所造成的信道损失后&#xff0c;以太网总的信道利用率并不能达到100% 3.…

HackerGPTWhiteRabbitNeo的使用及体验对比

1. 简介 WhiteRabbitNeo&#xff08;https://www.whiterabbitneo.com/&#xff09;是基于Meta的LLaMA 2模型进行特化的网络安全AI模型。通过专门的数据训练&#xff0c;它在理解和生成网络安全相关内容方面具有深入的专业能力&#xff0c;可广泛应用于教育、专业培训和安全研究…

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接 第一步&#xff1a;安装 SQL Server 数据库 这是一个很详细的安装教程&#xff0c;可以参考一下 安装SQL Server详细教程 需要注意&#xff1a;安装实例时&#xff0c;建议在‘身份验证模式’直接选择“混合模式”…

Flink定制化功能开发,demo代码

前言&#xff1a; 这是一个Flink自定义开发的基础教学。本文将通过flink的DataStream模块API&#xff0c;以kafka为数据源&#xff0c;构建一个基础测试环境&#xff1b;包含一个kafka生产者线程工具&#xff0c;一个自定义FilterFunction算子&#xff0c;一个自定义MapFunctio…

Tiktok/抖音旋转验证码识别

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

win10系统postgresql重装软件后原数据如何迁移

1、备份postgresql安装目录下的data文件夹 2、重新安装postgresql同一版本的软件 3、停止postgresql-x64-12服务 4、替换data文件夹 删除postgresql安装后新的的data文件夹 删除后将第一步备份的data文件夹粘贴过来&#xff0c;还是同一位置 5、启动postgresql-x64-12服务 …

[笔记]深度学习入门 基于Python的理论与实现(一)

代码仓库 gitee 1. python 入门 1.5之前是python安装和基础语法, 我直接跳过了 1.5 Numpy 深度学习中经常出现数组和矩阵运算&#xff0c;Numpy 的数组类 numpy.array 提供了很多便捷的方法 1.5.1 导入 Numpy import numpy as np1.5.2 生成 Numpy 数组 np.array()&#xf…

C语言从入门到实战——联合体和枚举

联合体和枚举 前言一、 联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合的一个练习 二、枚举类型2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使用 前言 C语言中&#xff0c;联合体&#xff08;union&#…

Shape-IoU——综合考量边框形状与尺度的度量

今天看到一篇文章主要是提出了一种更有效的IOU度量方法&#xff0c;论文地址在这里&#xff0c;如下所示&#xff1a; 摘要 边界盒回归损失作为检测器定位分支的重要组成部分&#xff0c;在目标检测任务中起着重要作用。现有的边界框回归方法通常考虑GT框和预测框之间的几何关…

【深度学习每日小知识】Logistic Loss 逻辑回归

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

Spring Task 任务调度工具

大家好我是苏麟 , 今天聊聊Spring Task 任务调度工具 Spring Task Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 什么是定时任务 ? 通过时…

IDEA连接Github⭐️使用Git工具上传本地文件到远程仓库

环境准备 已安装IDEA开发工具&#xff0c;Git版本管理工具&#xff0c;已注册GitHub账号 需要先准备好这些环境&#xff0c;可以自行搜索教程&#xff0c;下面的安装是基于这里的环境上操作的 目录 一、需要提供SSH公钥 ​二、Github配置SSH公钥 ​三、IDEA配置连接 四、连…

微信小程序分销商城在线搭建源码系统:轻松无忧 带完整的安装部署教程

随着移动互联网的快速发展&#xff0c;微信小程序作为一种新的应用形态&#xff0c;已经深入到人们生活的方方面面。尤其在电商领域&#xff0c;微信小程序分销商城为商家提供了一种全新的销售渠道。然而&#xff0c;对于许多不具备技术背景的商家来说&#xff0c;如何快速搭建…

Flutter-Web从0到部署上线(实践+埋坑)

本文字数&#xff1a;7743字 预计阅读时间&#xff1a;60分钟 01 前言 首先说明一下&#xff0c;这篇文章是给具备Flutter开发经验的客户端同学看的。Flutter 的诞生虽然来自 Google 的 Chrome 团队&#xff0c;但大家都知道 Flutter 最先支持的平台是 Android 和 iOS&#xff…

使用WAF防御网络上的隐蔽威胁之CSRF攻击

在网络安全领域&#xff0c;除了常见的XSS&#xff08;跨站脚本&#xff09;攻击外&#xff0c;CSRF&#xff08;跨站请求伪造&#xff09;攻击也是一种常见且危险的威胁。这种攻击利用用户已经验证的身份在没有用户知情的情况下&#xff0c;执行非授权的操作。了解CSRF攻击的机…