嵌入式 内存泄漏检测工具valgrind以及mtrace

注意:

1、二进制文件不能strip

2、二进制文件最好使用-g

3、官方文档valgrind:http://valgrind.org/docs/download_docs.html,这是其官方帮助文档,比较全面

 valgrind --tool=memcheck --leak-check=full  ./x86_joseph_qrcode

usage

  • x86 平台
  • 先编译你自己的应用程序
  • 命令行:
    • valgrind --log-file=1 --tool=memcheck ./a.out

error specification

一、有malloc,但未free

  • code
    <span style="font-family:Courier New;font-size:10px;">#include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
            char *p = malloc(20);
            sprintf(p, "%s", "test");
            fprintf(stderr, "p:%s/n", p);
    }
    </span>
  • 分析:
    • 文件后部,总体来看,有确定无疑的lost 20字节。如下:
      <span style="font-family:Courier New;font-size:10px;">==26512== LEAK SUMMARY:
      ==26512==    definitely lost: 20 bytes in 1 blocks.
      </span>
    • 在文件之前描述的内容,细节可以看出,有1个malloc,但未去free。如下:
      <span style="font-family:Courier New;font-size:10px;">==26512== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 1)
      ==26512== malloc/free: in use at exit: 20 bytes in 1 blocks.
      ==26512== malloc/free: 1 allocs, 0 frees, 20 bytes allocated.
      </span>

二、free一个未malloc的指针

  • code
    <span style="font-family:Courier New;font-size:10px;">void main()
    {
            char p[] = "hello";
            fprintf(stderr, "p:%s/n", p);
            free(p);
    }
    </span>
  • 分析:
    • 文件后部,总体来看,有1个错误,0个malloc,1个free。如下:
      <span style="font-family:Courier New;font-size:10px;">==26786== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 1)
      ==26786== malloc/free: in use at exit: 0 bytes in 0 blocks.
      ==26786== malloc/free: 0 allocs, 1 frees, 0 bytes allocated.
      </span>
    • 在文件之前描述的内容,细节可以看出,有一个无效的free。如下:
      <span style="font-family:Courier New;font-size:10px;">==26786== Invalid free() / delete / delete[]
      ==26786==    at 0x402265C: free (vg_replace_malloc.c:323)
      ==26786==    by 0x804841F: main (in /home/yutao/test/a.out)
      </span>

三、stack中,无效的读取,不会提示出错

  • code
    <span style="font-family:Courier New;font-size:10px;">void main()
    {
            char p[8] = "hello"; //p在栈上, "hello"在常量区
            fprintf(stderr, "p10:%c/n", p[10]);
    }
    </span>
  • 分析:
    • 读取stack栈中的内容,不会提示错误
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值