内存调试

1. valgrind检测内存泄漏状况

  valgrind功能非常强大,检测内存泄漏,内存初始化等很多问题,但同时valgrind在嵌入式上面对CPU占用会影响性能,而且必须代码退出才能得出结果,不便于动态检测。如果有一些程序,在运行时一直malloc,但是结束都free了, 那这样的程序valgrind也检测不出问题。

2. gcc -fsanitize=address 选项

gcc编译时加上-fsanitize=address,编译好的二进制文件,运行结束打印内存统计信息,类似valgrind

gcc -fsanitize=address -g -o memDebug memDebug.c 

3.实时监控内存使用情况

    3.1. --wrap功能   gcc -o test main.c -Wl,--wrap,malloc -Wl,--wrap,free 用GCC的wrap功能自己实现malloc和free来监控使用情况

    3.2 malloc/free自带功能,在程序调用malloc出来的内存,系统会有一个“记录”,而且在得到的指针前面几个字节会有一些信息,我们可以利用malloc前面几个字节的信息来记录malloc/free的情况。在Linux 32位系统中,前面8字节记录了malloc的时候系统开辟的尺寸信息(如:malloc(0)也能成功,有些系统也开辟了24字节左右的空间),free的时候可以根据这个信息得到free的size,这样就可以动态监控malloc的空间。在Windows debug模式下也有相关信息,甚至还记录有malloc的调用者的信息;在Linux系统也提供了malloc_usable_size函数,用于获取malloc size,但很多嵌入式系统中该函数并没有保留,我们可以通过以下函数获取malloc size. 不同平台需要修改int *ptr = (int *)_ptr - 2;这一行,有的-2,有的-4;

int malloc_usable_size(int* _ptr)
{
    int *ptr = (int *)_ptr - 2;

//    printf("Free size:%u %x  %x  %x \n",ptr[0], ptr[1], ptr[2], ptr[3]);
    return ptr[0];
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值