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

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介:

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

作者:曾金龙

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

领域:迅雷下载库

时间: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转移到聊哪件衣服好看了,恩,不错。



相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
2月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
37 3
|
13天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
34 6
|
28天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
45 6
|
1月前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
183 9
|
1月前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
46 6
|
1月前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
46 3
|
1月前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
2月前
|
Web App开发 开发者
|
2月前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
2月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数