mtrace内存泄漏工具的使用方法
原理:
mtrace 工具的主要思路是在我们的调用内存分配和释放的函数中装载 “钩子(hook)” 函数,通过 “钩子(hook)” 函数打印的日志来帮助我们分析对内存的使用是否存在问题。
具体的做法是 mtrace() 函数中会为那些和动态内存分配有关的函数(譬如 malloc()、realloc()、memalign() 以及 free())安装 “钩子(hook)” 函数,这些 hook 函数会为我们记录所有有关内存分配和释放的跟踪信息,而 muntrace() 则会卸载相应的 hook 函数。基于这些 hook 函数生成的调试跟踪信息,我们就可以分析是否存在 “内存泄漏” 这类问题。
使用
1、使用到的相关函数代码:
#include <mcheck.h>void mtrace(void);void muntrace(void);
mtrace()
函数用于开启内存使用记录;muntrace()
函数用于取消内存使用记录;- 内存使用情况记录到一个文件,值由环境变量:MALLOC_TRACE决定。
2、mtrace 机制需要我们实际运行一下程序,然后才能生成跟踪的日志,通过定义并导出一个环境变量 MALLOC_TRACE
告诉 mtrace (即前文提到的 hook
函数)生成日志文件的路径,如下所示。
$ export MALLOC_TRACE=./trace.log
3、在代码中添加#include <mcheck.h>
头文件,mtrace、muntrace
函数,如下示例:
#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>int main(int argc, char **argv)
{mtrace();char * p = malloc(100);free(p);p = malloc(1000);muntrace();return 0;
}
输出的内存监测日志如下:
$ cat trace.log
= Start
@ ./a.out:[0x40062b] + 0xf15460 0x64
@ ./a.out:[0x40063b] - 0xf15460
@ ./a.out:[0x400645] + 0xf154d0 0x3e8
= End
mtrace内存泄漏工具的使用方法相关推荐
- java 内存泄漏 工具_Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法
JProfiler的内存视图会话提供了内存使用情况的动态更新视图以及分配点的信息视图.所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象.本文主要介绍如何意识到内存泄漏以及查找内存 ...
- Android 系统(87)---常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...
- linux valgrind memCheck ---内存检查工具的可视化方法valkyrie
linux valgrind memCheck -内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1.安装valgrind valgrind 安 ...
- 常见的内存泄漏原因及解决方法
常见的内存泄漏原因及解决方法 参考文章: (1)常见的内存泄漏原因及解决方法 (2)https://www.cnblogs.com/leeego-123/p/12187677.html 备忘一下.
- Android 内存泄漏分析与解决方法
Android 内存泄漏分析与解决方法 参考文章: (1)Android 内存泄漏分析与解决方法 (2)https://www.cnblogs.com/start1225/p/6903419.html ...
- 什么是javascript内存泄漏?以及解决方法
什么是javascript内存泄漏?以及解决方法 一.什么是javascript内存泄漏? 二.常见的内存泄漏 1.意外的全局变量(通常是变量未被定义或者胡乱引用了全局变量) 2.计时器 3.闭包 4 ...
- malloc钩子和内存泄漏工具mtrace、Valgrind
一:malloc钩子函数 static void* (* old_malloc_hook) (size_t,const void *); static void (* old_free_hook)(v ...
- android释放acitity内存,Android 内存泄漏分析与解决方法
在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...
- android中常见的内存泄漏和解决的方法
android中的内存溢出预计大多数人在写代码的时候都出现过,事实上突然认为工作一年和工作三年的差别是什么呢.事实上干的工作或许都一样,产品汪看到的结果也都一样,那差别就是速度和质量了. 写在前面的一 ...
最新文章
- android中PreferencesActivity的使用(一)
- ATDD验收测试驱动开发
- leetcode 879. 盈利计划(dp)
- 一道很简单的贪心算法题~【贪心:我不要脸的伐?】
- asp.net网页中导出EXCEL,WORD的环境设置验证实例
- CI/CD(持续集成构建/持续交付):如何测试/集成/交付项目代码?(Jenkins,TravisCI)
- Vue-在data中引入静态图片路径
- KMP算法模板与解析
- Oracle数据库用户查询常用命令
- Markdown桌面最佳编辑器
- 阿里巴巴开放平台Oauth2.0协议获取access_token
- Mat iplimage
- 如何玩Chrome的小恐龙游戏
- html制作动态3d图片,如何制作3D动态图片?
- 【HDL系列】Brent-Kung树形加法器原理与设计
- 64位CPU,64位操作系统,和64位应用程序三者之间的关系
- 颜宁发微博“求救” 要投拆造谣公众号
- OSWE 尾篇 考试的方法论
- Linux中SELinux理解
- Matlab之随机森林TreeBagger