mtrace调试关于malloc与free的问题
本帖最后由 zsbit9611 于 2021-5-27 00:18 编辑linux下学习mtrace内存泄漏调试时遇到的问题,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>
void mtrace_func(int **p);
int main()
{
setenv("MALLOC_TRACE", "/var/tmp/mtraceOutput", 1);
mtrace();
int *p = NULL;
mtrace_func(&p);
printf("addr in main: %p\n", p);
//muntrace();
return 0;
}
void mtrace_func(int **p)
{
printf("addr in func: %p\n", *p);
}
终端输出为:
addr in func: (nil)
addr in main: (nil)
查看mtrace日志信息:
= Start
@ /lib/x86_64-linux-gnu/libc.so.6:(_IO_file_doallocate+0x94) + 0x20838d0 0x400
@ /lib/x86_64-linux-gnu/libc.so.6: - 0x20832a0
@ /lib/x86_64-linux-gnu/libc.so.6:(tdestroy+0x36) - 0x2083490
@ /lib/x86_64-linux-gnu/libc.so.6: - 0x20834c0
@ /lib/x86_64-linux-gnu/libc.so.6: - 0x20838d0
可以看到有内存分配(第一行中的“+”)的步骤,且后续进行了多次不同地址的内存释放(“-”步骤)
上述代码中并无malloc及相关分配内存函数
求问为什么mtrace中会有内存分配的步骤,多次内存释放的原因又是什么? 上面的输出已经很明显了,你写的代码中确实没有使用,但是libc.so.6 这个库中用了内存分配函数
人造人 发表于 2021-5-27 00:12
上面的输出已经很明显了,你写的代码中确实没有使用,但是libc.so.6 这个库中用了内存分配函数
为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗? zsbit9611 发表于 2021-5-27 00:14
为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?
你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放资源,释放内存,调用exit函数退出你的程序 人造人 发表于 2021-5-27 00:18
你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放 ...
非常感谢!麻烦再请教两个问题:
1. 我程序中如果正确调用了malloc / free,mtrace日志中是没有c库“+”的,只有程序“+”,请问这个怎么解释?
2. 我在网上查到的部分资料里不推荐使用muntrace,推荐让程序自行退出。那么如果不调用muntrace的话,mtrace的日志输出里肯定会有c库进行内存资源回收(c库的“-”)是吗? 不对吧,试试这个代码,没有记录
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>
int main(void) {
mtrace();
//char *str = malloc(32);
//free(str);
muntrace();
return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
$ cat trace.log
= Start
= End
$
这是有的
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>
int main(void) {
mtrace();
char *str = malloc(32);
free(str);
muntrace();
return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
$ cat trace.log
= Start
@ ./main: + 0x55c2e21b2690 0x20
@ ./main: - 0x55c2e21b2690
= End
$
看明白了吗,是printf导致的
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
#include <mcheck.h>
int main(void) {
mtrace();
printf("hello world!\n");
muntrace();
return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
hello world!
$ cat trace.log
= Start
@ /usr/lib/libc.so.6:(_IO_file_doallocate+0x94) + 0x5635058a0690 0x400
= End
$
人造人 发表于 2021-5-27 09:22
不对吧,试试这个代码,没有记录
好的,我再试试。非常感谢{:10_254:}
页:
[1]