1.安装bcc工具,命令:sudo apt-get install bpfcc-tools linux-headers-$(uname -r)
参考说明:https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---binary
安装完成后,切换到/usr/sbin目录下使用ls查看,如图:

2.准备一个C程序,放到自己的家目录下,程序代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
long long *fibonacci(long long *n0, long long *n1)
{
//分配1024个长整数空间方便观测内存的变化情况
long long *v = (long long *) calloc(1024, sizeof(long long));
*v = *n0 + *n1;
return v;
}
void *child(void *arg)
{
long long n0 = 0;
long long n1 = 1;
long long *v = NULL;
int n = 2;
for (n = 2; n > 0; n++) {
v = fibonacci(&n0, &n1);
n0 = n1;
n1 = *v;
printf("%dth => %lld\n", n, *v);
sleep(1);
}
}
int main(void)
{
pthread_t tid;
pthread_create(&tid, NULL, child, NULL);
pthread_join(tid, NULL);
printf("main thread exit\n");
return 0;
}
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
long long *fibonacci(long long *n0, long long *n1)
{
//分配1024个长整数空间方便观测内存的变化情况
long long *v = (long long *) calloc(1024, sizeof(long long));
*v = *n0 + *n1;
return v;
}
void *child(void *arg)
{
long long n0 = 0;
long long n1 = 1;
long long *v = NULL;
int n = 2;
for (n = 2; n > 0; n++) {
v = fibonacci(&n0, &n1);
n0 = n1;
n1 = *v;
printf("%dth => %lld\n", n, *v);
sleep(1);
}
}
int main(void)
{
pthread_t tid;
pthread_create(&tid, NULL, child, NULL);
pthread_join(tid, NULL);
printf("main thread exit\n");
return 0;
}

使用命令:gcc -pthread -o app app.c 编译app.c文件

使用命令:./app 运行app文件,如图:

再开一个终端,使用命令:vmstat 3 如图:

我们可以看出free(可用内存)上下浮动慢慢减少,而buff(磁盘缓存),cache(文件缓存)上下浮动基本保持不变.
使用命令:Ctrl +C 关闭程序.
再次使用命令:./app运行C 程序.如图:

在打开第二个终端中使用命令:ps aux | grep app查看进程id;如图:

使用命令: sudo /usr/sbin/memleak-bpfcc -p 23556 运行;如图:
从图中结合代码看出内存泄漏的位置;如图:

仅部分代码:

可以看出代码中的*v,没有释放.造成内存泄漏.
改进代码:

改进后,重复上面的操作.编译-->运行;结果如下:

浙公网安备 33010602011771号