`
阿尔萨斯
  • 浏览: 4172688 次
社区版块
存档分类
最新评论

C语言内存泄露检测--Memwatch

 
阅读更多

项目:迅雷下载库内存泄露检测

作者:曾金龙

供职:深圳迅雷网络技术股份有限公司

领域:迅雷下载库

时间:2014-07-26


迅雷的移动下载库是用C语言编写的,为了能够横跨欧亚非拉偷笑(ios,android,还有诺基亚的什么系统来着,对了symban)和性能,我们厂的下载库就选择了C,然后在C代码里面使用各种宏,预编译等来达到一 个下载库,多平台使用。不过平台相关的都已经约束在了一个叫common的库里面的一个子模块里面了。这极大的解放了我厂的码农朋友。

但是C毕竟是C,在聊起C的时候,我们组最喜欢说的是,我们权限最大,想干啥干啥。最悲痛的是,测试妹子过来了,然后说各种问题,但是logcat都捕获不到,或者有时候崩溃了但是没有tombstone,等。其实,C最大的危险就是内存泄露。。。因为C的内存泄露,我和测试妹子的感情最近变得更加的亲密而又微妙。。。


老大发话了,必须解决所有C内存泄露。。。

在我下写我负责的数据存储模块的时候,我就动了一个小技巧,就能够把本模块的内存泄露全部给检测出来,而我这朴素的思想其实也是其他内存泄露检测工具的灵魂,只是,老大嫌我的太朴素了。

我的做法很简单,每次malloc内存的时候不是调用系统的malloc,而是调用我的malloc,取名为fc_malloc(因为我的模块叫file_cache),free则调用fc_free。具体代码如下:

#define fc_malloc(size) fc_malloc_imp(size,__FILE__,__LINE__)

#define fc_free(ptr) fc_free_imp(ptr)

typedef struct mem_log{
void* addr;
char* file;
int   line;
}memlog;
#ifdef _LOGGER
static list g_mem_list
#endif // _LOGGER
void init_module()
{
    #ifdef _LOGGER
    list_init(&g_mem_list);
    #endif
}

void uninit_module()
{
    #ifdef _LOGGER
    list_for_each(g_mem_list,v)
    {
        memlog* iterm=(memlog*)LIST_VALUE(v);
        printf("%s,%d,%x\n",iterm->file,iterm->line,iterm->addr);//output the memory not free..
        free(iterm);
    }
    list_clear(&g_mem_list);

    #endif // _LOGGER

}

void* fc_malloc_imp(size_t size,char* file,int line)
{
    void* ptr=malloc(size);

    #ifdef _LOGGER

    if(ptr!=NULL)
    {
        memlog* iterm = (memlog*)malloc(sizeof(memlog));
        iterm->addr=ptr;
        iterm->file=file;
        iterm->line=line;
        list_insert(&g_mem_list,iterm);
    }
    #endif // _LOGGER
    return ptr;
}
void fc_free_imp(void* ptr)
{
    #ifdef _LOGGER
    if(ptr!=NULL)
    {
        list_erase_by_addr(&g_mem_list,ptr);//in this funciton we need free the memlog iterm memory.
    }

    #endif // _LOGGER
    free(ptr);
}

却是很简单,说白了就是用一个链表去等级下每次malloc的地址信息,当然为了好定位,包含文件和行信息,然后在模块卸载的时候,就可以打印出哪些内存还没有被释放。这样对于检查内存泄露,已经达到目的了,很简单吧。有用的东西都是很简单,但很巧妙。

在老大说我应该去看下现有的内存检测工具之前,我觉得我 的这个“创作”已经帮了我解决了所有的内存泄露问题,至少,我和测试妹子的关系从聊bug转移到聊哪件衣服好看了,恩,不错。



分享到:
评论

相关推荐

    memwatch内存泄露检测工具(内附在VS使用memwatch使用教程)

    MEMWATCH 支持 ANSI C,它提供结果日志记录,能检测双重释放(double-free)、错误释放(erroneous free)、没有释放的内存(unfreed memory)、溢出和下溢等等。实用极其方便

    node-memwatch:一个NodeJS库来关注您的内存使用情况,并发现并隔离泄漏

    node-memwatch在这里可以帮助您检测和查找Node.JS代码中的内存泄漏。 它提供: leak事件,在代码出现泄漏内存时发出。 偶尔发出的stats事件,可为您提供描述堆使用情况和随时间变化趋势的数据。 HeapDiff类使您...

    内存泄漏检测工具MEMWATCH源码

    内存泄漏检测工具,由C语言完成全功能,方便加载到用户程序。

    C/C++ 内存泄露检测工具 memwatch2.69

    C/C++ 内存泄露检测工具 memwatch,下载

    memwatch内存泄漏检测源码.zip

    针对野指针,内存泄漏有很好的检测定位作用,经本人亲自测试,可以很清楚定位到行数以及泄漏多少字节,比较方便。

    内存泄漏检测工具源码

    MemWatch由 Johan Lindh 编写,是一...MemWatch支持 ANSI C,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneous free)、内存泄漏(unfreed memory)、溢出(Overflow)、下溢(Underflow)等等。

    c语言程序内存泄漏检查

    用于C语言代码内存泄露的检查,代码较简单,比较容易理解

    memwatch内存检测的正确使用.rar

    memwatch内存检测工具,配置相应的预处理器,运行后会生成Libmem文件,提示程序中相应的内存泄露说明

    内存泄露检测工具

    LINUX 内存泄露检测工具 MEMWATCH DMALLOC

    内存检测memwatch

    最近在UNIX下开发代码,用到了附件中检测内存泄露的代码。内存泄露检测是编写代码最难预防的,只能从养成好的编程习惯来减少。-Recently developed under the UNIX code, use the annex to memory leak detection ...

    检验内存泄漏memwatch源码

    开发中用于内存泄漏memwatch源码文件。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    Linux内存调试器memwatch

    MEMWATCH 由 Johan Lindh 编写,是一个开放源代码 C 语言内存错误检测工具,它提供结果日志纪录,能检测双重释放(double-free)、错误释放(erroneous free)、没有释放的内存(unfreed memory)、溢出和下溢等等。

    memwatch.tar.gz

    #内存泄露# #memwatch# memwatch使用示例 MemWatch是一个开放源代码 C 语言内存错误检测工具。MemWatch支持 ANSI C,它提供结果日志纪录。

    memwatch.zip

    内存泄漏检测 1. vs配置 在vs项目中添加memwatch类, 项目属性 -> c/c++ ->预编译 -> 与编译器定义 编辑添加 MEMWATCH DMW_STDIO 两个定义 2. 使用 Source.cpp #define _CRT_SECURE_NO_WARNINGS #include #...

    memwatch

    版本:2.7.1 MEMWATCH是一个C/C++内存泄漏检测工具,只要支持ANSI C的编译器就可以使用它,因此可以算是与平台无关的

    几款内存泄漏工具的使用心得

    内存泄露问题一直是软件测试的重难点。因实际应用需要,网上找了几款工具,进行了试用和比较,在此把使用方法和使用效果记录下来,以方便后续应用:valgrind splint memwatch cppcheck Dmalloc gcc自带检测 ccmalloc

    用mtrace分析内存泄露

    对于嵌入式系统中运行的程序,一般来说程序启动的时候会分配很多内存,然后一直运行下去,不会显式释放这些内存,这部分内存并不会...这些内存有没有泄露,memwatch和dmalloc就不太适合这种处理,mtrace就比较合适。

    memwatch_for_memory_leak_detect

    使用memwatch检测代码内存操作的示例代码。

    浅析Node.js中的内存泄漏问题

    这篇文章是由Mozilla的Identity团队带来的 A Node.JS Holiday Season系列文章的首篇,该团队上个月发布了 Persona的第一个测试版本。...我们会介绍 node-memwatch — 一个帮助发现并隔离Node中的内存泄漏问题的函数库

    memwatch2.71

    memwatch源码,学习参考

Global site tag (gtag.js) - Google Analytics