当前位置:   article > 正文

linux基于LD_PRELOAD机制的内存泄露检测工具

linux基于LD_PRELOAD机制的内存泄露检测工具

Valgrind影响性能且某些程序会报错,同时我们希望跳过初始化阶段,在程序稳定运行之后再去检测内存是否会持续增涨,为了更高效的记录内存分配情况,采用b+树.该程序会拦截malloc,free,calloc,realloc,new,delete。记录lr地址,方便解析脚本定位调用的代码位置.

1.测试DEMO

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Pree Enter Twice to PreMalloc\n");
    getchar(), getchar();
    char *p = (char *)calloc(1, 512);
    free(p);

    p = (char *)calloc(1, 512);
    free(p);

    p = (char *)calloc(1, 512);
    // free(p);

    p = (char *)calloc(1, 512);
    // free(p);

    p = (char *)calloc(1, 512);
    free(p);

    char *buf = new char[1280];
    printf("Pree Enter Twice to Test Malloc Free\n");
    getchar(), getchar();
    printf("TestOver\n");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2.编译拦截程序及测试DEMO

make clean && make
  • 1

3.设置环境变量,运行DEMO程序

LD_PRELOAD=$PWD/libMemLeakTrackerPreload.so ./malloc_demo
  • 1

4.等DEMO稳定后,向DEMO发送USR2信号,开启内存泄露监测

killall -USR2 malloc_demo
  • 1

5.DEMO运行一段时间后,向DEMO发送USR1信号,将未释放的内存信息保存到memleak.txt中

killall -USR1 malloc_demo
  • 1

6.结合/proc/pid/maps和上面保存的memleak.txt,生成内存泄露报告(哪个位置分配了多少次,多少字节)

python3 parser.py /proc/`pidof malloc_demo`/maps memleak.txt
cat mem_leak_report.txt
  • 1
  • 2

输出

------------------[INFO]Count:1 Total:1280(Byte)---------------------
/home/MemChecker/malloc_demo main /home/MemChecker/preload_demo.cpp:23
------------------[INFO]Count:1 Total:512(Byte)---------------------
/home/MemChecker/malloc_demo main /home/MemChecker/preload_demo.cpp:14
------------------[INFO]Count:1 Total:512(Byte)---------------------
/home/MemChecker/malloc_demo main /home/MemChecker/preload_demo.cpp:17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/588287
推荐阅读
相关标签
  

闽ICP备14008679号