聊一聊内存泄漏 ------在valgrind检查不出来时怎么办??
Posted codestack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊一聊内存泄漏 ------在valgrind检查不出来时怎么办??相关的知识,希望对你有一定的参考价值。
这几天多个版本出现了多个内存泄漏问题-----------------------------------------怎么办????
Q1:进程调用某库函数分配内存不释放, 但是在进程退出时,统一释放内存,valgrind 检查不出来,但是频繁调用库函数会耗尽内存。怎么快速定位那个库函数导致!!!!!除了看源码这种sa办法
Q2:某些设备不支持跑valgrind 怎么办??-
目前C&C++ 动态分配内存都是使用malloc-free new-delete
所以第一个方法是 每次分配内存时先记录下来 释放时记录下来 这样一对比就出来。。。or malloc记录地址 free 去掉记录地址
最后剩下的就是 没有释放的。。。。
第二个方法就是hook malloc了
http://www.gnu.org/savannah-checkouts/gnu/libc/manual/html_node/Hooks-for-Malloc.html
再就是 http://jemalloc.net/jemalloc.3.html#arena.i.chunk_hooks
第三个:malloc是一个weak symbol,所以直接写一个malloc同名函数就行,同名函数中可以通过符号 __libc_malloc,这个符号直接指向malloc的实现部分
--------------->GCC wrap
ld中有一个选项 –wrap,当查找某个符号时,它优先先解析__wrap_symbol, 解析不到才去解析symbol。
好像对C++的new不起作用。
extern void *__libc_malloc(size_t size); void* malloc (size_t size) { // do your stuff { } // call the original malloc return __libc_malloc(size); }
再就是mtrace 了
再就是对比之前版本---看下这个版本改了什么了。。。再或者就是看覆盖率,那些没有跑到,然后review代码了。。。
还要啥方法?????????????????????
以上是关于聊一聊内存泄漏 ------在valgrind检查不出来时怎么办??的主要内容,如果未能解决你的问题,请参考以下文章