鱼C论坛

 找回密码
 立即注册
查看: 2087|回复: 6

[已解决]mtrace调试关于malloc与free的问题

[复制链接]
发表于 2021-5-27 00:00:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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)[0x7f9818d7fe84] + 0x20838d0 0x400
@ /lib/x86_64-linux-gnu/libc.so.6:[0x7f9818e9683d] - 0x20832a0
@ /lib/x86_64-linux-gnu/libc.so.6:(tdestroy+0x36)[0x7f9818e18996] - 0x2083490
@ /lib/x86_64-linux-gnu/libc.so.6:[0x7f9818e96826] - 0x20834c0
@ /lib/x86_64-linux-gnu/libc.so.6:[0x7f9818e9696c] - 0x20838d0

可以看到有内存分配(第一行中的“+”)的步骤,且后续进行了多次不同地址的内存释放(“-”步骤)
上述代码中并无malloc及相关分配内存函数

求问为什么mtrace中会有内存分配的步骤,多次内存释放的原因又是什么?
最佳答案
2021-5-27 00:18:55
zsbit9611 发表于 2021-5-27 00:14
为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?

你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放资源,释放内存,调用exit函数退出你的程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-27 00:12:55 | 显示全部楼层
上面的输出已经很明显了,你写的代码中确实没有使用,但是libc.so.6 这个库中用了内存分配函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-27 00:18:55 | 显示全部楼层    本楼为最佳答案   
zsbit9611 发表于 2021-5-27 00:14
为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?

你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放资源,释放内存,调用exit函数退出你的程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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库的“-”)是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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:[0x55c2e0a54180] + 0x55c2e21b2690 0x20
@ ./main:[0x55c2e0a54190] - 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)[0x7f33bdd18754] + 0x5635058a0690 0x400
= End
$ 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-28 12:37:48 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-5-27 09:22
不对吧,试试这个代码,没有记录



好的,我再试试。非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-14 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表