手撕检测内存泄漏组件

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

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

代码:

执行结果:

目录
相关文章
|
8天前
|
开发工具 Swift iOS开发
【Swift开发专栏】Swift中的内存泄漏检测与修复
【4月更文挑战第30天】本文探讨了Swift中的内存泄漏问题,尽管有ARC机制,但仍需关注内存管理。文章分为三部分:内存管理基础知识、检测方法和修复技巧。了解ARC原理和循环引用陷阱是防止内存泄漏的关键。检测方法包括使用Xcode内存调试器、LeakSanitizer和性能分析工具。修复技巧涉及打破循环引用、使用弱/无主引用及手动管理内存。理解这些对优化应用性能和稳定性至关重要。
|
3月前
|
缓存 监控 Python
在Python中,如何检测和处理内存泄漏?
【2月更文挑战第7天】【2月更文挑战第18篇】在Python中,如何检测和处理内存泄漏?
|
4月前
|
安全 Linux 编译器
内存泄漏检测组件的分析与实现(linux c)-mtrace工具使用
内存泄漏产生原因 在堆上使用malloc/remalloc/calloc分配了内存空间,但是没有使用free释放对应的空间。
77 0
|
4月前
|
Java C++
动手实现内存泄漏检测组件
动手实现内存泄漏检测组件
39 1
|
4月前
使用mtrace进行内存泄漏检测
使用mtrace进行内存泄漏检测
76 1
|
4月前
|
调度 C语言
内存泄漏检测相关内容
内存泄漏检测相关内容
26 0
|
2月前
|
IDE Linux 开发工具
内存泄漏检测工具Valgrind:C++代码问题检测的利器(一)
内存泄漏检测工具Valgrind:C++代码问题检测的利器
115 0
|
8天前
|
Dart 前端开发 Java
【Flutter前端技术开发专栏】Flutter中的内存泄漏检测与解决
【4月更文挑战第30天】本文探讨了Flutter应用中的内存泄漏检测与解决方法。内存泄漏影响性能和用户体验,常见原因包括全局变量、不恰当的闭包使用等。开发者可借助`observatory`工具或`dart_inspector`插件监测内存使用。解决内存泄漏的策略包括避免长期持有的全局变量、正确管理闭包、及时清理资源、妥善处理Stream和RxDart订阅、正确 disposal 动画和控制器,以及管理原生插件资源。通过这些方法,开发者能有效防止内存泄漏,优化应用性能。
【Flutter前端技术开发专栏】Flutter中的内存泄漏检测与解决
|
8天前
|
数据可视化 Java 测试技术
【Go语言专栏】Go语言中的内存泄漏检测与修复
【4月更文挑战第30天】Go语言内存泄漏详解:概念、原因、检测与修复。内存泄漏由忘记释放内存、循环引用等引起,Go通过垃圾回收机制管理内存,但仍有泄漏风险。检测方法包括pprof、可视化工具、代码审查和单元测试。修复策略涉及优化代码、使用defer、减少全局变量、弱引用及及时释放资源。实践案例分析有助于理解和解决问题。了解内存管理,防止泄漏,提升Go应用性能和稳定性。
|
2月前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
69 1