zsbit9611 发表于 2021-5-27 00:00:39

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中会有内存分配的步骤,多次内存释放的原因又是什么?

人造人 发表于 2021-5-27 00:12:55

上面的输出已经很明显了,你写的代码中确实没有使用,但是libc.so.6 这个库中用了内存分配函数

zsbit9611 发表于 2021-5-27 00:14:51

人造人 发表于 2021-5-27 00:12
上面的输出已经很明显了,你写的代码中确实没有使用,但是libc.so.6 这个库中用了内存分配函数

为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?

人造人 发表于 2021-5-27 00:18:55

zsbit9611 发表于 2021-5-27 00:14
为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?

你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放资源,释放内存,调用exit函数退出你的程序

zsbit9611 发表于 2021-5-27 00:35:34

人造人 发表于 2021-5-27 00:18
你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放 ...

非常感谢!麻烦再请教两个问题:
1. 我程序中如果正确调用了malloc / free,mtrace日志中是没有c库“+”的,只有程序“+”,请问这个怎么解释?
2. 我在网上查到的部分资料里不推荐使用muntrace,推荐让程序自行退出。那么如果不调用muntrace的话,mtrace的日志输出里肯定会有c库进行内存资源回收(c库的“-”)是吗?

人造人 发表于 2021-5-27 09:22:50

不对吧,试试这个代码,没有记录
$ 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
$

zsbit9611 发表于 2021-5-28 12:37:48

人造人 发表于 2021-5-27 09:22
不对吧,试试这个代码,没有记录




好的,我再试试。非常感谢{:10_254:}
页: [1]
查看完整版本: mtrace调试关于malloc与free的问题