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

 更新时间:2023年09月04日 09:09:52   作者:凌肖战  
这篇文章主要介绍了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 工具分析一下,上面地址是对应到哪一行 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 行代码存在内存泄露 。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • linux下NFS配置教程详解

    linux下NFS配置教程详解

    这篇文章主要为大家详细介绍了linux下NFS配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • linux下使用cmake编译安装mysql的详细教程

    linux下使用cmake编译安装mysql的详细教程

    这篇文章主要介绍了linux下使用cmake编译安装mysql的详细教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • ubuntu下安装程序的三种方法总结(推荐)

    ubuntu下安装程序的三种方法总结(推荐)

    下面小编就为大家带来一篇ubuntu下安装程序的三种方法总结(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • ubuntu16.04自动设置行号的步骤详解

    ubuntu16.04自动设置行号的步骤详解

    这篇文章主要介绍了ubuntu16.04自动设置行号的步骤,文中给大家提到了Ubuntu vi设置行号的方法,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • CentOS7系统增加swap的操作方法实例

    CentOS7系统增加swap的操作方法实例

    这篇文章主要给大家介绍了关于CentOS7系统增加swap的操作方法,文中通过示例代码介绍的非常详细,对大家的学习或者使用CentOS7系统具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • Vim 强制保存只读类型文件的方法

    Vim 强制保存只读类型文件的方法

    你是否会和我一样经常碰到这样的情景:在VIM中编辑了一个系统配置文件,当需要保存时才发现当前的用户对该文件没有写入的权限。这个时候就需要强制保存只读类型文件的方法了,这篇文章就介绍了Vim强制保存只读类型文件的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • Linux启动过程分析和常见错误汇总

    Linux启动过程分析和常见错误汇总

    这篇文章介绍了Linux系统的引导过程、系统初始化进程及文件、MBR扇区故障处理、GRUB引导故障处理、服务控制及优化启动过程等内容
    2025-04-04
  • 在Windows的Apache服务器上配置对PHP和CGI的支持

    在Windows的Apache服务器上配置对PHP和CGI的支持

    这篇文章主要介绍了在Windows的Apache服务器上配置对PHP和CGI的支持,其中CGI脚本文中演示的为Perl示例,需要的朋友可以参考下
    2015-07-07
  • Apache Log4j2 远程代码执行漏洞分析+检测+防护(最新推荐)

    Apache Log4j2 远程代码执行漏洞分析+检测+防护(最新推荐)

    Apache Log4j2是一款开源的Java日志框架,被广泛地应用在中间件、开发框架与Web应用中,用来记录日志信息,这篇文章主要介绍了Apache Log4j2 远程代码执行漏洞分析+检测+防护(最新推荐),需要的朋友可以参考下
    2024-07-07
  • Ubuntu 14.04下Django和MySQL环境部署全过程

    Ubuntu 14.04下Django和MySQL环境部署全过程

    这篇文章主要介绍了Ubuntu 14.04下Django和MySQL环境部署全过程,文中通过一步步的安装步骤介绍的很详细,相信对大家具有一定的参考借鉴价值,有需要的朋友们下面来一起来看看吧。
    2017-02-02

最新评论