[linux c/c++] 使用mtrace 和 muntrace 进行应用程序的内存问题跟踪

前言:

内存直接访问想来都是c/c++语言的精髓,但往往也是疑难杂症的高发区,内存泄漏问题最为常见,同时也非常难以定位,mtrace即muntrace通过向内核中注册钩子函数以获得内核关于内存管理的相关信息,进而进行一定的逻辑分析,给出相应的建议。

 

函数接口:

   void mtrace(void)
      通过对内存管理系列函数(malloc,realloc,memalign,free)注册钩子来达到监控内存泄露和其他内存错误操作
   void muntrace(void)
      用来解除mtrace注册的钩子

 

使用方法:

In normal usage, mtrace() is called once at the start of execution of a program, and muntrace() is never called.

 

案例:

//The  shell session below demonstrates the use of the mtrace() function and the //mtrace(1) command in a program that has memory leaks at two differ‐
//ent locations.  The demonstration uses the following program:

           $ cat t_mtrace.c
           #include <mcheck.h>
           #include <stdlib.h>
           #include <stdio.h>

           int
           main(int argc, char *argv[])
           {
               int j;

               mtrace();

               for (j = 0; j < 2; j++)
                   malloc(100);            /* Never freed--a memory leak */

               calloc(16, 16);             /* Never freed--a memory leak */
               exit(EXIT_SUCCESS);
           }

/*
       When we run the program as follows, we see that mtrace() diagnosed memory leaks at two different locations in the program:

           $ cc -g t_mtrace.c -o t_mtrace
           $ export MALLOC_TRACE=/tmp/t
           $ ./t_mtrace
           $ mtrace ./t_mtrace $MALLOC_TRACE
           Memory not freed:
           -----------------
              Address     Size     Caller
           0x084c9378     0x64  at /home/cecilia/t_mtrace.c:12
           0x084c93e0     0x64  at /home/cecilia/t_mtrace.c:12
           0x084c9448    0x100  at /home/cecilia/t_mtrace.c:16

       The first two messages about unfreed memory correspond to the two malloc(3) calls inside the for loop.  The final message corresponds to the  call
       to calloc(3) (which in turn calls malloc(3)).
*/

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值