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;
}
使用命令: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,没有释放.造成内存泄漏.

改进代码:

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

 

 

 
 
 
posted on 2019-07-30 11:39  清风不问烟雨&  阅读(1757)  评论(0)    收藏  举报