鱼C论坛

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

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

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

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

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

x
本帖最后由 zsbit9611 于 2021-5-27 00:18 编辑

linux下学习mtrace内存泄漏调试时遇到的问题,代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mcheck.h>

  4. void mtrace_func(int **p);

  5. int main()
  6. {
  7.     setenv("MALLOC_TRACE", "/var/tmp/mtraceOutput", 1);

  8.     mtrace();
  9.     int *p = NULL;
  10.     mtrace_func(&p);
  11.     printf("addr in main: %p\n", p);
  12.     //muntrace();

  13.     return 0;
  14. }
  15.                                                                                                                                                                                                            
  16. void mtrace_func(int **p)
  17. {
  18.     printf("addr in func: %p\n", *p);
  19. }
复制代码


终端输出为:
  1. addr in func: (nil)
  2. addr in main: (nil)
复制代码


查看mtrace日志信息:
  1. = Start
  2. @ /lib/x86_64-linux-gnu/libc.so.6:(_IO_file_doallocate+0x94)[0x7f9818d7fe84] + 0x20838d0 0x400
  3. @ /lib/x86_64-linux-gnu/libc.so.6:[0x7f9818e9683d] - 0x20832a0
  4. @ /lib/x86_64-linux-gnu/libc.so.6:(tdestroy+0x36)[0x7f9818e18996] - 0x2083490
  5. @ /lib/x86_64-linux-gnu/libc.so.6:[0x7f9818e96826] - 0x20834c0
  6. @ /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函数退出你的程序
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

为什么c库会调用分内存分配,是因为我传了个指针的地址到函数里吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的程序没有内存怎么运行?
C库帮你申请内存,初始化资源,调用你的main函数,你的main函数返回后释放资源,释放内存,调用exit函数退出你的程序
小甲鱼最新课程 -> https://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库的“-”)是吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-27 09:22:50 | 显示全部楼层
不对吧,试试这个代码,没有记录
  1. $ cat main.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <mcheck.h>

  5. int main(void) {
  6.     mtrace();
  7.     //char *str = malloc(32);
  8.     //free(str);
  9.     muntrace();
  10.     return 0;
  11. }
  12. $ gcc -g -Wall -o main main.c
  13. $ ./main
  14. $ cat trace.log
  15. = Start
  16. = End
  17. $
复制代码


这是有的
  1. $ cat main.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <mcheck.h>

  5. int main(void) {
  6.     mtrace();
  7.     char *str = malloc(32);
  8.     free(str);
  9.     muntrace();
  10.     return 0;
  11. }
  12. $ gcc -g -Wall -o main main.c
  13. $ ./main
  14. $ cat trace.log
  15. = Start
  16. @ ./main:[0x55c2e0a54180] + 0x55c2e21b2690 0x20
  17. @ ./main:[0x55c2e0a54190] - 0x55c2e21b2690
  18. = End
  19. $
复制代码


看明白了吗,是printf导致的
  1. $ cat main.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <mcheck.h>

  5. int main(void) {
  6.     mtrace();
  7.     printf("hello world!\n");
  8.     muntrace();
  9.     return 0;
  10. }
  11. $ gcc -g -Wall -o main main.c
  12. $ ./main
  13. hello world!
  14. $ cat trace.log
  15. = Start
  16. @ /usr/lib/libc.so.6:(_IO_file_doallocate+0x94)[0x7f33bdd18754] + 0x5635058a0690 0x400
  17. = End
  18. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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



好的,我再试试。非常感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 12:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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