当前位置: 首页 > article >正文

Linux下 mtrace工具排查内存泄露问题

一. mtrace工具排查内存泄露

内存泄露为申请了堆内存,但没有释放,即未还给操作系统。长此以往,系统的可分配内存越来越少,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

 Linux下进行 C/C++ 开发,常常会动态分配一些堆内存。那就可能会存在"内存泄露"的问题。如果 Linux下做 C/C++ 开发时,出现内存泄漏了,我们该如何去定位呢?

常用的定位工具:mtrace 工具 与 valgrind工具 ,这两个都是典型的内存泄漏分析工具。

1.  mtrace 工具使用思路

在我们的调用内存分配和释放的函数中装载 “钩子(hook)” 函数,通过 “钩子” 函数打印的 log 日志,对日志文件的分析来帮助我们分析对内存的使用是否存在问题。

对该工具的使用包括两部分内容:一个是要修改源码,装载 hook 函数。另一个是通过运行修改后的程序,生成特殊的 log 文件。然后利用  mtrace工具分析日志,判断是否存在内存泄露以及定位可能发生内存泄露的代码位置。

2.  mtrace 工具使用说明

接下来用一段代码说明一下, mtrace 工具如何定位 "内存泄露" 。在使用之前,需要修改我们的源码,用来跟踪内存分配和释放,其中需要使用两个函数:

#include <mcheck.h>void mtrace(void);   //开启内存分配跟踪  
void muntrace(void); //关闭内存分配跟踪

将上述函数接口加入待检测的代码中,代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <mcheck.h>int main(int argc, char **argv)
{setenv("MALLOC_TRACE", "memery_leak.log", 1);mtrace();char *p1 = (char*)malloc(16);char* p2 = (char*)malloc(20);free(p1);p1 = NULL;muntrace();return 0;
}

编译代码,终端输入命令:gcc -g main.c -o main.out

运行程序,终端输入:./main.out 命令。当前目录下就会生成 memory_leak.log 文件。

定位问题,终端输入:mtrace main.out memory_leak.log 命令后,并没有定位到 C 源码的具体行数,如下所示:

使用addr2line 工具分析

下面使用 地址转化工具 addr2line 工具分析一下,上面地址是对应到哪一行 C 代码行。如下所示:

 可以看出,能够猜到可能是后面的地址不对。导致 addr2line 工具转换失败。

网上百度到,可能的原因如下:

1. 关闭 Linux 系统的 ASLR 功能。

ASLR 功能全称为 Address Space Layout Randomization,地址空间布局随机化。它将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险。

2. 编译源码时,加上 "-no-pie" 选项。

下来进行具体的操作,操作如下:

(1)关闭 ASLR 功能:

输入命令:cat /proc/sys/kernel/randomize_va_space ,查看 Linux 系统的 ASLR 值是 2,说明默认 ASLR 功能是开启的。

设置 ASLR 的值:输入命令 : echo 0 > /proc/sys/kernel/randomize_va_space

(2)加入 "-no-pie" 选项后重新编译程序。输入命令: gcc -g -no-pie main.c -o main.out

(3)然后运行程序,终端输入命令: ./main.out

(4)使用 mtrace 工具查看 新生成的 memory_leak.log 文件。

如下所示:

可以看到,定位到了 C 代码中的具体行。到此,mtrace 工具定位到 C 代码的具体的 11 行代码存在内存泄露 。

http://www.lryc.cn/news/2419626.html

相关文章:

  • 解决xftp6 要继续使用此程序,您必须应用最新的更新或使用新版本
  • 经典java视频教程,个人无私分享
  • 开源 java CMS - FreeCMS1.9公布。
  • 针对搜索引擎的高级搜索方法(Baidu,Google,Bing....)
  • settimer()函数和alarm()函数
  • MTA邮件传送代理--sendmail完全配置
  • java response.sendredirect_「response.sendredirect」HttpServeltResponse接口中sendRedirect方法详解 - seo实验室...
  • 数据治理——主数据项目实施
  • C++ 获取鼠标点击位置
  • 开源评论系统 Isso 全攻略
  • (SDL2)SDL在ubuntu下的测试代码(雷霄骅)
  • 负数求补码
  • short 下 32768的二进制
  • winRAR 破解注册码
  • 文件加密系统的设计与实现(源码+开题报告)
  • contest11 CF510E div2 ooxxx oooox oooox
  • Spider爬虫框架之Spiders模块
  • JS-变量提升与暂时性死区概念
  • 什么是WordPress?
  • jq-jquery根据内容设置select和input radio选中
  • 高数 | 工具及必备方法 | 【一元函数积分学】常用积分公式表
  • default-gateway和default-router的区别
  • Apche部署https详解
  • 采样定理的证明与推导
  • XSLT知识总结
  • 传说中的“摸奶节”!随便你怎么摸!
  • 社会网络分析与人脉网络:如何建立有效的人脉资源
  • Toybox、toolbox、busybox 软件协议
  • HTTP代理和SOCKS代理
  • 内存术语详解