手撕检测内存泄漏组件

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

内存泄漏的原因通常是进行了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则不需要调用该函数、

代码:

执行结果:

目录
相关文章
|
5月前
|
开发工具 Swift iOS开发
【Swift开发专栏】Swift中的内存泄漏检测与修复
【4月更文挑战第30天】本文探讨了Swift中的内存泄漏问题,尽管有ARC机制,但仍需关注内存管理。文章分为三部分:内存管理基础知识、检测方法和修复技巧。了解ARC原理和循环引用陷阱是防止内存泄漏的关键。检测方法包括使用Xcode内存调试器、LeakSanitizer和性能分析工具。修复技巧涉及打破循环引用、使用弱/无主引用及手动管理内存。理解这些对优化应用性能和稳定性至关重要。
206 0
|
5月前
|
缓存 监控 Python
在Python中,如何检测和处理内存泄漏?
【2月更文挑战第7天】【2月更文挑战第18篇】在Python中,如何检测和处理内存泄漏?
467 3
|
5月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
1210 0
|
6天前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
3月前
|
存储 算法 Java
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
Java面试题:深入探究Java内存模型与垃圾回收机制,解释JVM中堆内存和栈内存的主要区别,谈谈对Java垃圾回收机制的理解,Java中的内存泄漏及其产生原因,如何检测和解决内存泄漏问题
53 0
|
4天前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
1月前
|
Linux Windows
检测进程内存的活跃程度
检测进程内存的活跃程度
|
2月前
|
Linux 测试技术 C++
内存管理优化:内存泄漏检测与预防。
内存管理优化:内存泄漏检测与预防。
44 2
|
3月前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。
|
5月前
|
算法 Java Python
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测
【5月更文挑战第18天】Python内存管理关乎程序性能与稳定性。优化包括避免过多临时对象,如优化列表推导式减少对象创建。警惕循环引用造成的内存泄漏,如示例中的Node类。使用`gc`模块检测泄漏,通过`gc.set_debug(gc.DEBUG_LEAK)`和`gc.collect()`获取信息。实践中需持续分析内存使用,优化算法、数据结构和资源释放,以提升程序质量与效率。
63 9
【Python 的内存管理机制专栏】Python 内存管理实战:性能优化与内存泄漏检测

热门文章

最新文章

下一篇
无影云桌面