内存泄漏检测方式

一 、 日志记录

        通过宏定义重载了 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.mzph.cn/news/627189.shtml

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

相关文章

基于java web的机票管理系统设计与实现设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

中国康复辅助器具协会脊柱侧弯康复技术委员会成立大会圆满召开

2024年1月13日,由中国康复辅助器具协会主办,中国康复辅助器具协会脊柱侧弯康复辅助器具技术专业委员会承办,北京蓝田医疗设备有限公司协办,中国康复辅助器具协会脊柱侧弯康复辅助器具技术专业委员会成立大会暨脊柱侧弯康复辅助器具技术交流会在北京市山西大厦隆重召开。本次会议…

Linux -- firewalld的富语言规则

1. Firewalld支持两种类型的NAT&#xff1a;IP地址伪装和端口转发。 &#xff08;1&#xff09;IP地址伪装 地址伪装&#xff08;masquerade)&#xff1a;通过地址伪装&#xff0c;NAT 设备将经过设备的包转发到指定接收方&#xff0c;同时将通过的数据包的源地址更改为其自己的…

基于SSM的流浪动物救助网站的设计与实现-计算机毕业设计源码82131

摘 要 随着生活水平的持续提高和家庭规模的缩小&#xff0c;宠物已经成为越来越多都市人生活的一部分&#xff0c;随着宠物的增多&#xff0c;流浪的动物的日益增多&#xff0c;中国的流浪动物领养和救助也随之形成规模&#xff0c;同时展现巨大潜力。本次系统的是基于SSM框架的…

C语言:底层剖析——函数栈帧的创建和销毁

一、究竟什么是函数栈帧 C语言的使用是面向过程的&#xff0c; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了。所以C语言的程序都是以函数作为基本单位的&#xff0c;如果能够深入理解…

全光谱护眼灯有哪些?寒假护眼台灯推荐

全光谱指的是包含了整个可见光谱范围以及部分红外和紫外光的光线。通常的白炽灯或荧光灯只能发出有限范围内的光波&#xff0c;而全光谱台灯通过使用多种类型的LED灯或荧光灯管来产生更广泛的光谱。这样的光谱更接近自然光&#xff0c;能够提供更真实的颜色还原和更好的照明效果…

【MFC】学生成绩管理系统(期末项目)

如果需要代码请评论区留言或私信 课程设计具体实现 数据库设计 E-R图 关系模式 教师(工号&#xff0c;姓名&#xff0c;学院) 主键(工号)学生(学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;班级&#xff0c;专业&#xff0c;学分) 主键(学号)课程(课程…

element-ui el-table表格勾选框条件禁用,及全勾选按钮禁用, 记录

项目场景&#xff1a; 表格的部分内容是可以被勾选的&#xff0c;部分内容是不可以被勾选的 使用的是 “element-plus”: “^2.2.22”, 以上应该都是兼容的 问题描述 要求el-table表格中&#xff0c;部分内容不可以被勾选&#xff0c;全选框在没有可选内容时&#xff0c;是禁…

【漏洞复现】Sentinel Dashboard SSRF漏洞(CVE-2021-44139)

Nx01 产品简介 Sentinel Dashboard是一个轻量级的开源控制台&#xff0c;提供机器发现以及健康情况管理、监控、规则管理和推送的功能。它还提供了详细的被保护资源的实际访问统计情况&#xff0c;以及为不同服务配置的限流规则。 Nx02 漏洞描述 CVE-2021-44139漏洞主要存在于…

一些面试会问到的奇怪问题与面试总结

1.v-for、v-if先后顺序。 官方不建议一起使用&#xff0c;但是有时候面试的时候会问到。 在vue2中是v-for先与v-if的。 源码js编译结果&#xff1a; _c()就是vm.$createElement()&#xff0c;意思是创建一个虚拟的element&#xff0c;就是返回值是VNode。 _l就是renderlist…

【项目经验】详解Puppeteer入门及案例

文章目录 一.项目需求及Puppeteer是什么&#xff1f;二.Puppeteer注意事项及常用的方法1.注意事项2.常用的方法*puppeteer.launch&#xff08;&#xff09;**browser.newPage()**page.goto()**page.on(request&#xff0c;&#xff08;&#xff09;> {}&#xff09;**page.e…

USB Redirector本地安装并结合内网穿透实现远程共享和访问USB设备

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 USB Redirector是一款方便易用的USB设备共享服务应用程序&#xff0c;它提供了共享和访问本地或互联网上的U…

【dc-dc】世微AP5127平均电流型LED降压恒流驱动器 双色切换的LED灯驱动方案

这是一款双色切换的LED灯方案&#xff0c;12-50V 降压恒流,输出&#xff1a;6V 2.5A ​ 这是一款PWM工作模式 , 高效率、 外围简单、内置功率管&#xff0c;适用于 输入的 高 精度降压 LED 恒流驱动芯片。输出大功率可 达 25W&#xff0c;电流 2.5A。 可实现全亮/半亮功能切换…

上门按摩系统:科技与传统融合的新体验

在快节奏的现代生活中&#xff0c;人们越来越重视身心健康。传统的按摩方式虽然深受喜爱&#xff0c;却常因时间、地点的限制而无法满足需求。此时&#xff0c;上门按摩系统应运而生&#xff0c;将科技与传统的按摩技艺完美结合&#xff0c;为用户提供更便捷、个性化的服务。 上…

【Linux】自定义shell

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 获取命令行前置字段命令行输入解析命令行普通指令的执行子进程执行命令指令类型判断 && 内建命令总结 &&a

uniapp的nvue是什么

什么是nvue uni-app App 端内置了一个基于 weex 改进的原生渲染引擎&#xff0c;提供了原生渲染能力。 在 App 端&#xff0c;如果使用 vue 页面&#xff0c;则使用 webview 渲染&#xff1b;如果使用 nvue 页面(native vue 的缩写)&#xff0c;则使用原生渲染。一个 App 中可…

深入解析JavaScript中new Function语法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 Function是JavaScript中非常重要的内置构造函数,可以用来动态创建函数…

十大必备功能:打造高效知识库的关键因素

一个好的产品知识库应该成为客户了解产品功能、解决故障和满足产品相关查询的重要资源。但如果没有合理地维护和更新&#xff0c;其可能就失去了存在的价值。 知识库的有效性取决于其包含的信息是否全面、准确和实用。而要实现这一点&#xff0c;需要关注一些关键功能。 以人…

go中如何进行单元测试案例

一. 基础介绍 1. 创建测试文件 测试文件通常与要测试的代码文件位于同一个包中。测试文件的名称应该以 _test.go 结尾。例如&#xff0c;如果你要测试的文件是 math.go&#xff0c;那么测试文件可以命名为 math_test.go。 2. 编写测试函数 测试函数必须导入 testing 包。每…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 理论题

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…