内存泄漏检测方式

这篇具有很好参考价值的文章主要介绍了内存泄漏检测方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 、 日志记录

        通过宏定义重载了 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 0


void *_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 free
		printf("double free: %p\n", p);
		return ;
	}
	free(p);

}


#define malloc(size) _malloc(size, __FILE__, __LINE__)
#define free(p)		 _free(p, __FILE__, __LINE__)



#endif

int main() {

//	DEBUG_MEM_LEAK

	void *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 free
			printf("double free: %p\n", p);
			return ;
		}
		free_f(p);

	} else {
		free_f(p);
	}
	
}


//hook

//dlsym


void 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_LEAK

	void *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"); 
}

内存泄漏检测方式,开发语言,服务器,c++,linux,数据结构文章来源地址https://www.toymoban.com/news/detail-796448.html

到了这里,关于内存泄漏检测方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++内存泄漏检测工具

    在程序中增加相应的内存检测工具  #define CRTDBG MAP ALLOC #include stdlib.h #include crtdbg.h #ifdef DEBUG #ifndef DBGNEW #define DBG_NEW new (_NORMAL_BLOCK,_FILE_LINE_) #define new DBG NEW #endif #endif _CrtDumpMemoryLeaks(); 当没有释放内存时候: 增加了delete时候:  

    2024年01月25日
    浏览(86)
  • LeakCanary内存泄漏检测框架分析。

    一、什么叫内存泄漏、内存溢出? 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个10M的Bitmap,但系统分配给APP的连续内存不足10M,就会导致内存溢出。 内存泄漏(memory leak):是指程序在申请内存后,无法释放已申

    2024年02月15日
    浏览(45)
  • 项目性能优化-内存泄漏检测与修改

    最近终于有空优化一波项目的性能了,第一波借助Android Studio自带的Profiler工具检测内存泄漏。 右侧带有绿色原点的就是此时运行的Profiler的SESSION,点击右侧MEMORY进入内存监控的详情模块 第三步中抓取一段时间后,会自动停止,并打开Heap Dump文件 可以看到抓取到2个会导致内存

    2024年02月11日
    浏览(54)
  • iOS 内存泄漏检测 Instruments Leaks

    Xcode 中 按住 command + I 或者菜单栏 Product – Profile 2. 双击 Leaks 或者按 choose,打开 Leaks 面板 3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测。 4. 在运行过程中如果发现Leak Checks(如图)出现红色X说明检测到内存泄露,将鼠标点击Leak Checks,在下方即可看到内存

    2024年02月01日
    浏览(44)
  • Python中的内存泄漏及其检测方法

    一、引言 内存泄漏是编程中常见的问题之一,它会导致程序在运行过程中不断消耗内存,最终可能导致程序崩溃或性能下降。在Python中,内存泄漏也是一个需要关注的问题。本文将详细介绍Python中的内存泄漏及其检测方法,以帮助读者更好地理解和解决这个问题。 二、Pyth

    2024年02月22日
    浏览(58)
  • 使用asan检测内存泄漏、堆栈溢出等问题

    操作过程参考:链接 缘起:程序在移动端崩溃,mac端复现不了,于是在写个崩溃位置函数的调用demo,使用ASAN工具进行排查。 验证过程 1、代码 main.cpp 使用附加ASAN工具的方式进行编译: 执行: 没有问题,以上是验证过程,如有问题执行时ASAN会提示有问题的相关位置。 介绍

    2024年02月11日
    浏览(63)
  • 如何处理Flutter内存泄漏检测和优化

    处理Flutter内存泄漏问题是构建高性能、稳定的应用程序的关键部分之一。在本文中,我将详细介绍如何检测和优化Flutter内存泄漏问题,以确保应用程序的良好性能和用户体验。 1. 了解内存泄漏 在深入了解如何处理Flutter内存泄漏之前,首先需要了解什么是内存泄漏。内存泄

    2024年04月14日
    浏览(41)
  • android 如何进行内存泄漏检测及解决方法

    内存泄漏是在Android开发中常见的问题之一,它可能导致应用的内存占用逐渐增加,最终影响应用的性能和稳定性。以下是一些常见的方法来进行内存泄漏检测和解决: 1. 使用工具进行内存泄漏检测: Android Profiler: Android Studio提供的Android Profiler工具可以帮助您监视应用的内

    2024年02月07日
    浏览(51)
  • Android 源码浅析:Leakcanary 内存泄漏检测的好帮手

    我们一起来分析一下大名鼎鼎的 Leakcanary, 想必作为 Android 开发都多多少少接触过,新版本的 Leakcanary 也用 Kotlin 重写了一遍,最近详细查看了下源码,分享一下。 tips:本来是只想分析下内存泄漏检测部分,但写着写着就跑偏了,因为内存泄漏的检测难点在于对对象生命周期

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包