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 行代码存在内存泄露 。

总结

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

相关文章

  • Wampserver2.5配置虚拟主机出现403 Forbidden的处理方案

    Wampserver2.5配置虚拟主机出现403 Forbidden的处理方案

    WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以 及MySQL数据库的整合软件包。免去了开发人员将时间花费在繁琐的配置环境过程,从而腾出更多精力去做开发。在windows下将Apache+PHP+Mysql 集成环境,拥有简单的图形和菜单安装和配置环境。
    2014-09-09
  • linux 进程数最大值修改方法

    linux 进程数最大值修改方法

    这篇文章主要介绍了linux 进程数最大值修改方法,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Linux下如何寻找相同文件的方法

    Linux下如何寻找相同文件的方法

    这篇文章主要介绍了Linux下如何寻找相同文件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 判断Unix系统及库文件是32位还是64位的详解

    判断Unix系统及库文件是32位还是64位的详解

    这篇文章主要介绍了判断Unix系统及库文件是32位还是64位的的相关资料,这里整理下查看系统位数的命令,需要的朋友可以参考下
    2016-11-11
  • Linux之死锁与解决方式

    Linux之死锁与解决方式

    这篇文章主要介绍了Linux之死锁与解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Ubuntu Apahce2.4下无法访问JS目录的问题解决

    Ubuntu Apahce2.4下无法访问JS目录的问题解决

    这篇文章主要给大家介绍了如何解决Ubuntu Apahce2.4下无法访问JS目录的问题,文中介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • Apache日志管理和统计分析知识

    Apache日志管理和统计分析知识

    Apache服务器具备强大的日志功能,管理员可以方便、准备、及时地了解服务器状况;可以更好地防范黑客的攻击
    2016-04-04
  • Linux文件目录结构(小白版)

    Linux文件目录结构(小白版)

    这篇文章主要介绍了Linux文件目录结构(小白版),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 详解Linux指令文件覆盖和文件追加

    详解Linux指令文件覆盖和文件追加

    这篇文章主要介绍了Linux指令文件覆盖和文件追加,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 基于Linux下Nagios的安装与配置说明介绍[图]

    基于Linux下Nagios的安装与配置说明介绍[图]

    本篇文章小编为大家介绍,基于Linux下Nagios的安装与配置说明介绍[图]。需要的朋友参考下
    2013-04-04

最新评论