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操作系统原理 linux系统基础教程

    linux操作系统原理 linux系统基础教程

    很多对linux操作系统有兴趣的朋友想有一个深入的学习,本篇文章给大家详细讲解了linux操作系统的原理,希望能够对你有所帮助。
    2018-01-01
  • linux守护进程服务daemon、nohup、systemd的区别

    linux守护进程服务daemon、nohup、systemd的区别

    守护进程(Daemon)是指在后台运行的进程,不与用户直接交互,且在系统启动时自动运行,nohup是一个命令行实用程序,用于在用户注销后继续运行命令,‌Systemd‌用于管理和启动服务,支持复杂的依赖管理和自动启动
    2025-03-03
  • 在linux下玩转带有超时时间的connect函数

    在linux下玩转带有超时时间的connect函数

    今天小编就为大家分享一篇关于在linux下玩转带有超时时间的connect函数,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • linux c下log输出代码模板示例代码

    linux c下log输出代码模板示例代码

    这篇文章主要给大家介绍了关于在linux c下log输出代码模板的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 搭建linux服务器详细教程

    搭建linux服务器详细教程

    这篇文章主要介绍了搭建linux服务器详细教程,主要包括linux服务器的部署、配置和搭建步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Linux systemctl命令用法及使用说明

    Linux systemctl命令用法及使用说明

    systemctl是Linux中用于管理系统服务的工具,提供了启动、停止、重启和查看服务状态等功能,通过systemctl命令,用户可以方便地管理各种服务
    2026-03-03
  • 在Bash脚本中创建和使用数组方法总结

    在Bash脚本中创建和使用数组方法总结

    在本篇文章里小编给大家整理了关于在Bash脚本中创建和使用数组方法和相关知识点,需要的朋友们在学习下。
    2019-03-03
  • CentOS7连接XShell与网络配置的方法

    CentOS7连接XShell与网络配置的方法

    这篇文章主要介绍了如何使用CentOS7连接XShell与网络配置的方法,可以更好的帮助大家工作和学习,感兴趣的小伙伴可以了解下
    2020-05-05
  • linux centos7离线安装telnet包全过程

    linux centos7离线安装telnet包全过程

    文章详细介绍了在CentOS 7系统上离线安装Telnet及其相关服务的步骤,包括下载RPM包、检测安装情况、卸载现有包、按正确顺序安装新的包、配置服务、重启服务以及测试安装是否成功
    2026-03-03
  • Linux中如何查询运行文件的全路径的方法

    Linux中如何查询运行文件的全路径的方法

    这篇文章主要介绍了Linux中如何查询运行文件的全路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论