c/c++ 内存泄漏检测

简介: c/c++ 内存泄漏检测

线上系统发现虚拟内存在不断的涨,出现内存泄露如何解;

1、内存泄露为什么不好处理;

       1)虚拟内存在涨的时候,我们不确定是程序的需要还是内存泄漏;

       2)不知道到底是哪行代码导致内存泄漏;

内存泄漏产生的原因无非是malloc/new和free/delete调用不匹配;

2、如何判断内存泄漏,哪个地方的代码实现导致内存泄漏;内存泄漏检测;

       1)通过mtrace检测内存泄漏;运行代码后通过mem.txt日志查看内存泄漏情况;对于线上系统是需要重启的,如果不重启可以通过热更新,在.conf文件中加入mtrace;

运行上图程序得到mem.txt文件如下,通过+和-的匹配情况判断是否有内存泄漏;

然后通过addr2line命令就可以查看是在哪里出现了内存泄漏;

       2)宏定义检测内存泄漏;

宏定义检测的优缺点:只适合在单文件中使用;

对于线上系统,通过热更新检测;

       3)通过hook方式检测内存泄漏;

typedef void *(*malloc_t)(size_t size);
typedef void (*free_t)(void *ptr);
malloc_t malloc_f = NULL;
free_t free_f = NULL;
int enable_malloc_hook = 1;
int enable_free_hook = 1;
void *malloc(size_t size) {
    if(enable_malloc_hook)
   {
        enable_malloc_hook= 0;
        void *p = malloc_f(size);
        void * caller = __builten_return address(0);
        char buff[128];
       sprintf(buff, "./mem/%p.mem", p);
        FILE *fp = fopen(buff,"w");
        fprintf(fp,"[+]%s :%d, addr: %p,size: %ld\n"FILE_,_LINE__, p,size);
        fflush(fp);
        enable malloc_hook = 1;
    }
    else
    {
        p = malloc_f(size);
    }
    return p;
}
void free(void *ptr) {
    if(enable_free_hook)
    {
        enable_free_hook = 0;
        char buff[128] = (0};
        sprintf(buff,"./mem/%p.mem", p);
        free_f(ptr);
        enable free hook = 1;
    }
}
static void init_hook(void) {
    if (malloc_f == NULL) {
        malloc_f = (malloc_t)dlsym(RTLD_NEXT, "malloc");
    }
    if (free_f == NULL) {
        free_f = (free_t)dlsym(RTLD_NEXT, "free");
    }
}
int main() {
    init_hook();
    void *p1 = malloc(10); 
    void *p2 = malloc(15);
    void *p3 = malloc(20);
    free(p2);
    free(p3);
}

       4)__libc_malloc();接口,malloc底层调用的是该接口;思路和hook是一样的;

       5)老版本接口,是被攻击的很重要的点,即__malloc_hook,是一种指针的方式;系统提供了一个指针,每一次调用malloc函数的时候,底层会调用到__malloc_hook指针,这个指针是固定的值;这是linux本身提供的hook的机制;这种方式慎用,因为它已经是已被遗弃的老的接口;

目录
相关文章
|
10天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
31 6
|
9天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
32 4
|
18天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
128 9
|
18天前
|
监控 JavaScript 前端开发
如何检测和解决 JavaScript 中内存泄漏问题
【10月更文挑战第25天】解决内存泄漏问题需要对代码有深入的理解和细致的排查。同时,不断优化和改进代码的结构和逻辑也是预防内存泄漏的重要措施。
34 6
|
21天前
|
Web App开发 缓存 JavaScript
如何检测和解决闭包引起的内存泄露
闭包引起的内存泄露是JavaScript开发中常见的问题。本文介绍了闭包导致内存泄露的原因,以及如何通过工具检测和代码优化来解决这些问题。
|
1月前
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
103 21
|
28天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 C语言 C++
【C++打怪之路Lv6】-- 内存管理
【C++打怪之路Lv6】-- 内存管理
37 0
【C++打怪之路Lv6】-- 内存管理
|
1月前
|
Web App开发 开发者
|
24天前
|
缓存 监控 Java
内存泄漏:深入理解、检测与解决
【10月更文挑战第19天】内存泄漏:深入理解、检测与解决
43 0