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
完成!
和《通过valgrind 输出的偏移地址定位源码行号》http://blog.csdn.net/stephen_yin/article/details/43228913
使用mtrace定位动态库中内存泄露的位置。
一、创建两个源文件:
1、main.c
#include
#include
extern void all(int **p);
int main()
{
}
2、inter.c
#include
void all(int **p)
{
}
二、分别编译
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:
-----------------
0x09a95480
有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()
{
}
# 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
08049000-0804a000 r--p 00000000 08:08 1648267
0804a000-0804b000 rw-p 00001000 08:08 1648267
09334000-09355000 rw-p 00000000 00:00 0
b7564000-b7566000 rw-p 00000000 00:00 0
b7566000-b7709000 r-xp 00000000 08:08 531299
b7709000-b770b000 r--p 001a3000 08:08 531299
b770b000-b770c000 rw-p 001a5000 08:08 531299
b770c000-b770f000 rw-p 00000000 00:00 0
b7728000-b7729000 r-xp 00000000 08:08 1648259
b7729000-b772a000 r--p 00000000 08:08 1648259
b772a000-b772b000 rw-p 00001000 08:08 1648259
b772b000-b772d000 rw-p 00000000 00:00 0
b772d000-b772e000 r-xp 00000000 00:00 0
b772e000-b774e000 r-xp 00000000 08:08 528550
b774e000-b774f000 r--p 0001f000 08:08 528550
b774f000-b7750000 rw-p 00020000 08:08 528550
bf92f000-bf950000 rw-p 00000000 00:00 0
可以看到, 动态库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:
-----------------
0x09334480
0xb772847a - 0xb7728000 = 0x0000047a
九、定位出错位置
wang@wangyaqi:~/workspace$ addr2line -e ./libinter.so 0x0000047a
/home/wang/workspace/inter.c:5
完成!

加载中…