手撕检测内存泄漏组件

简介: 手撕检测内存泄漏组件

内存泄漏的原因通常是进行了malloc(或类似操作)又没有进行free。

检测内存泄漏需要关注:1、判断是否有内存泄漏。2、内存泄漏发生在哪一行。

宏定义方法制造组件

该方法仅适用于单文件检测内泄漏,因为宏定义只在当前文件中有效。

这里的组件指的是利用宏定义功能将内存操作相关的函数(malloc,free等)在保留原有功能的基础上增添上所需功能的函数。

如何判断是否有内存泄漏?

该组件可以在每次程序malloc的时候根据内存地址生成一个内存相关文件,每次程序free的时候根据内存地址销毁相关文件。最后如果有剩余文件,说明有内存泄漏

如何判断泄漏发生在哪一行?

用__LINE__和__FILE__宏定位发生内存操作的具体代码位置。

如何设置组件开关?

通过设置flag决定是否开启检测组件。

代码:

Hook方法制造组件

Hook方法制造组件除了单文件,也适合检测多文件、第三方库等是否存在内存泄漏,以及非第三方库造成的内存泄漏在哪一行等。

Hook在编程中是一种技术,这种技术简单来说就是让函数(也能是类、事件等)在保留原有功能的基础上,拓展功能。相比起宏,函数功能的拓展可以不仅仅在当前文件中,也能在其他文件中。

在本案例用dlsym实现hook,过程如下:

1、定义能容纳原函数的函数类型并构造相关变量。

2、将原函数存储在相关变量中。

3、重新实现与原函数同名的函数,在其中调用相关的函数变量,以此保留原函数的功能,并增加功能。

重点细节:

  1. 有些第三方库的函数(比如printf、getchar),会在底层的代码中调用malloc,为了防止循环调用形成阻塞,需要设置变量和if引导第三方的库的函数调用malloc的时候走的是重定义之前的malloc。
  2. Gcc编译的要加-g选项,-g是给编译的可执行文件添加调试信息(变量名、文件名、行号、类型信息等),方便我们在终端利用addr2line定位发生内存泄漏的行号。
  3. __builtin_return_address函数,会返回函数的地址。参数为0表示当前函数的调用地址。参数为1表示当前函数的调用的那一行所在的函数的地址。一般填0。
  4. 高版本的linux用addr2line识别行号, 传入的地址用自定义的函数ConvertToEL产生,是一个相对地址,相对代码载入内存中的起始地址。如果是低版本的linux则不需要调用该函数、

代码:

执行结果:

目录
相关文章
|
3天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
16 6
|
11天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
86 9
|
11天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
31 6
|
14天前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
2月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
4月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
63 0
|
28天前
|
Web App开发 开发者
|
17天前
|
缓存 监控 Java
内存泄漏:深入理解、检测与解决
【10月更文挑战第19天】内存泄漏:深入理解、检测与解决
28 0
|
1月前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
30天前
|
数据处理 Python
Python读取大文件的“坑“与内存占用检测
Python读取大文件的“坑“与内存占用检测
44 0