内存泄漏是 C 开发非常经典的问题,目前已经存在很多优秀的内存检测工具,比如强大的 Valgrind。
借助 ebpftrace 我们可以非常简单、直观的找到泄漏的位置,而且非常灵活,自己决定其中的细节。
文中我构建了一个 leak.c,其中同时存在正确释放的内存和泄漏的内存,模拟一些比较复杂的内存泄漏情况。通过 ebpftrace 对运行中的 leak 程序统计内存的申请和释放过程定位内存泄漏,也就是 probe 两个关键的接口调用:
malloc
free
这两个接口的实现在 libc 中,后面我们会找到 leak 连接的准确 libc.so 文件。
leak.c
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
char*wrapper1(){
returnmalloc(8);
}
char*wrapper2(){
// leak here
char*p=wrapper1();
returnmalloc(16);
}
intmain(){
char*p=NULL;
for(inti=0; i<5; i++){
p=wrapper2();
free(p);
}
/* wait */
getchar();
return0;
}
代码非常简单,wrapper2 内调用 wrapper1 申请到的内存没有被返回,当然永远也不会被释放,发生了泄漏;而 wrapper2 自己 malloc 一块内存返回,并在 main 中被正确释放。
wrapper1 中申请的内存泄漏了;
wrapper2 中申请的内存没有泄漏;
只需要简单的编译即可使用:
gcc leak.c -o leak -g
我的工作路径是: /home/test
【文章福利】:免费领取更多C/C++ Linux服务器、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)有需要的可以点击 793599096 加群领取哦~