加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

mtrace定位动态库中内存泄露的位置

(2015-09-30 15:19:30)
标签:

股票

参考:《linux下检查内存泄露的工具--mtrace》http://blog.csdn.net/sunnydogzhou/article/details/6532436
和《通过valgrind 输出的偏移地址定位源码行号》http://blog.csdn.net/stephen_yin/article/details/43228913

使用mtrace定位动态库中内存泄露的位置。

一、创建两个源文件:
1、main.c
#include
#include

extern void all(int **p);

int main()
{
     setenv("MALLOC_TRACE", "output", 1); 
    mtrace(); 

    int *p;
    all(&p);

    int i;
    for (i=0; i<10; i++)
    {
        fprintf(stderr, "%p, %d\n", p, *p);
        p++;
    }

    return 1;
}

2、inter.c
#include

void all(int **p)
{
    *p = (int *)malloc(10*sizeof(int));

    int *tmp = *p;
    int i;
    for (i=0; i<10; i++)
    {
        *tmp=i+1;
        tmp++;
    }
}

二、分别编译
1、后者编译成动态库libinter.so
gcc -g inter.c -fPIC -shared -o libinter.so

2、前者调用该动态库,生成可执行文件main
gcc -g main.c -L"/home/wang/workspace" -linter -o main

三、执行main,生成output文件,执行结果如下:
wang@wangyaqi:~/workspace$ ./main
0x9a95480, 1
0x9a95484, 2
0x9a95488, 3
0x9a9548c, 4
0x9a95490, 5
0x9a95494, 6
0x9a95498, 7
0x9a9549c, 8
0x9a954a0, 9
0x9a954a4, 10

四、查看output文件内容
wang@wangyaqi:~/workspace$ mtrace output
- 0x09a95008 Free 3 was never alloc'd 0xb7573a34
- 0x09a950e0 Free 4 was never alloc'd 0xb762c78f
- 0x09a950f8 Free 5 was never alloc'd 0xb762c797

Memory not freed:
-----------------
   Address     Size     Caller
0x09a95480     0x28  at 0xb770347a

有40字节内存泄露,地址为0xb770347a

五、通过addr2line命令查看出错的位置
wang@wangyaqi:~/workspace$ addr2line -e ./libinter.so 0xb770347a
??:0
无法获取到。


参考《通过valgrind 输出的偏移地址定位源码行号》,做如下修改:
六、修改main.c内容,重新编译,生成main可执行文件
#include
#include

extern void all(int **p);

int main()
{
     setenv("MALLOC_TRACE", "output", 1); 
    mtrace(); 

    fprintf(stderr, "pid=%d\n", getpid());//新添加

    int *p;
    all(&p);

    int i;
    for (i=0; i<10; i++)
    {
        fprintf(stderr, "%p, %d\n", p, *p);
        p++;
    }

    fprintf(stderr, "11111111\n");//新添加
    sleep(30);//新添加

    return 1;
}
# gcc -g main.c -L"/home/wang/workspace" -linter -o main。

七、执行main,在打印出进程号,延时30s结束前,查看加载的动态库信息
wang@wangyaqi:~/workspace$ ./main
pid=1057
0x9334480, 1
0x9334484, 2
0x9334488, 3
0x933448c, 4
0x9334490, 5
0x9334494, 6
0x9334498, 7
0x933449c, 8
0x93344a0, 9
0x93344a4, 10
11111111

wang@wangyaqi:/proc$ cat 1057/maps
08048000-08049000 r-xp 00000000 08:08 1648267    /home/wang/workspace/main
08049000-0804a000 r--p 00000000 08:08 1648267    /home/wang/workspace/main
0804a000-0804b000 rw-p 00001000 08:08 1648267    /home/wang/workspace/main
09334000-09355000 rw-p 00000000 00:00 0          [heap]
b7564000-b7566000 rw-p 00000000 00:00 0
b7566000-b7709000 r-xp 00000000 08:08 531299     /lib/i386-linux-gnu/libc-2.15.so
b7709000-b770b000 r--p 001a3000 08:08 531299     /lib/i386-linux-gnu/libc-2.15.so
b770b000-b770c000 rw-p 001a5000 08:08 531299     /lib/i386-linux-gnu/libc-2.15.so
b770c000-b770f000 rw-p 00000000 00:00 0
b7728000-b7729000 r-xp 00000000 08:08 1648259    /home/wang/workspace/libinter.so
b7729000-b772a000 r--p 00000000 08:08 1648259    /home/wang/workspace/libinter.so
b772a000-b772b000 rw-p 00001000 08:08 1648259    /home/wang/workspace/libinter.so
b772b000-b772d000 rw-p 00000000 00:00 0
b772d000-b772e000 r-xp 00000000 00:00 0          [vdso]
b772e000-b774e000 r-xp 00000000 08:08 528550     /lib/i386-linux-gnu/ld-2.15.so
b774e000-b774f000 r--p 0001f000 08:08 528550     /lib/i386-linux-gnu/ld-2.15.so
b774f000-b7750000 rw-p 00020000 08:08 528550     /lib/i386-linux-gnu/ld-2.15.so
bf92f000-bf950000 rw-p 00000000 00:00 0          [stack]

可以看到, 动态库libinter.so加载的 base 地址是b7728000

八、用发生内存泄露的地址减去base地址0xb7728000, 得到相对偏移地址
wang@wangyaqi:~/workspace$ mtrace output
- 0x09334008 Free 3 was never alloc'd 0xb7598a34
- 0x093340e0 Free 4 was never alloc'd 0xb765178f
- 0x093340f8 Free 5 was never alloc'd 0xb7651797

Memory not freed:
-----------------
   Address     Size     Caller
0x09334480     0x28  at 0xb772847a

0xb772847a - 0xb7728000 = 0x0000047a

九、定位出错位置
wang@wangyaqi:~/workspace$ addr2line -e ./libinter.so 0x0000047a
/home/wang/workspace/inter.c:5

完成!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有