• Scott
    2019-01-01
    我比较关心老版本的Linux怎么做同样的事,毕竟没有办法升级公司服务器的内核。

    作者回复: 另一个用的比较多的是valgrind

    
     31
  • mj4ever
    2019-01-01
    老师:
    遇到了个问题,google也查不出所以然:
    1、ubuntu 18.04,内核4.15.0-29-generic
    2、运行 memleak -a -p $(pidof app),报错:
    Attaching to pid 14069, Ctrl+C to quit.
    perf_event_open(/sys/kernel/debug/tracing/events/uprobes/p__lib_x86_64_linux_gnu_libc_2_27_so_0x97070_14069_bcc_14199/id): Input/output error
    Traceback (most recent call last):
      File "/usr/share/bcc/tools/memleak", line 416, in <module>
        attach_probes("malloc")
      File "/usr/share/bcc/tools/memleak", line 406, in attach_probes
        pid=pid)
      File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 952, in attach_uprobe
        raise Exception("Failed to attach BPF to uprobe")
    Exception: Failed to attach BPF to uprobe
    展开
     1
     11
  • 萧董
    2018-12-31
    memleak输出中一直有addr就是内存没有释放吗
     2
     7
  • 阿卡牛
    2019-01-04
    老师,你这个例子是已经知道哪个进程有内存泄露了,请问如何找出哪个进程呢?

    作者回复: 去掉进程号选项

    
     5
  • 郭江伟
    2018-12-31
    本例中将动态分配内存改为使用数组,然后就不需要自己free了;
    将app.c拷贝为app2.c 做如下修改,因为篇幅有限没法贴完全代码:
    long long fibonacci(long long *n0, long long *n1)
    {
        //分配1024个长整数空间方便观测内存的变化情况
    //    long long *v = (long long *) calloc(1024, sizeof(long long));
             long long v[1024];
    然后执行memleak
    gjw@gjw:~$ sudo /usr/share/bcc/tools/memleak -p $(pidof app2c)
    Attaching to pid 3463, Ctrl+C to quit.
    [13:02:24] Top 10 stacks with outstanding allocations:
    [13:02:29] Top 10 stacks with outstanding allocations:
    ^Cgjw@gjw:~$ sudo /usr/share/bcc/tools/memleak -p $(pidof app2c)
    Attaching to pid 3463, Ctrl+C to quit.
    [13:02:43] Top 10 stacks with outstanding allocations:
    [13:02:48] Top 10 stacks with outstanding allocations:
    [13:02:53] Top 10 stacks with outstanding allocations:
    [13:02:58] Top 10 stacks with outstanding allocations:
    展开
     1
     5
  • 付盼星
    2018-12-31
    老师好,我有个问题想请教下,这里的堆栈和java虚拟机的堆栈是对应起来的么?
    
     5
  • 我来也
    2018-12-31
    [D18打卡]
    想不到又有神器可以直接分析出是哪个函数导致了内存泄露。
    以前都是在申请和释放的地方加标记,然后用工具去分析。
    思考题:
    一般能预分配的空间都没必要去动态申请。
    这个案例可以把存放结果的值先定义好,函数参数中用指针过去,这样就没必要申请内存了。
    展开
    
     4
  • Maxwell
    2019-01-02
    如果是java应用程序,也可以用这个方法定位么?

    作者回复: Java 看到的是JVM 的堆栈。其实,jmap这些Java原生的工具更好用

    
     2
  • Aaron Cheung
    2018-12-31
    坚持初衷,死磕就行,不退缩,不放弃!
    
     2
  • espzest
    2018-12-31
    程序长期运行后,VSZ一直增长,其中很绝大多数是匿名页导致的,有没有没法确定这些匿名页是依然在用? 如果没有再用,能有办法强制释放他们?
    
     2
  • airmy丶
    2019-12-01
    老师,请问下我去掉-p选项直接运行memleak -a ,下面的结果显示很多没有释放的内存 全部来自 [kernel] 这个是不正常的吗?
    
     1
  • 唯安格
    2019-03-12
    老师,我运行:$ /usr/share/bcc/tools/memleak -a -p $(pidof app) 并没有看到内存泄漏的问题。之后还看了app的源码。源码内的确没有调用free()函数。请问这可能是什么情况?
    root@ubuntu:/# /usr/share/bcc/tools/memleak -p $(pidof app) -a
    Attaching to pid 84307, Ctrl+C to quit.
    [02:42:22] Top 10 stacks with outstanding allocations:
    [02:42:27] Top 10 stacks with outstanding allocations:
    [02:42:32] Top 10 stacks with outstanding allocations:
    [02:42:37] Top 10 stacks with outstanding allocations:
    [02:42:43] Top 10 stacks with outstanding allocations:
    [02:42:48] Top 10 stacks with outstanding allocations:
    [02:42:53] Top 10 stacks with outstanding allocations:
    [02:42:58] Top 10 stacks with outstanding allocations:
    [02:43:03] Top 10 stacks with outstanding allocations:
    ^Croot@ubuntu:/# docker exec app cat /app.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <unistd.h>

    long long *fibonacci(long long *n0, long long *n1)
    {
        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;
        for (int 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;
    展开

    作者回复: 去掉进程号选项-p试试?

    
     1
  • Vicky🐣🐣🐣
    2019-02-23
    1. 如果执行/usr/share/bcc/tools/memleak -a -p [pid] 就会报错Exception: Failed to attach BPF to uprobe
    但是执行/usr/share/bcc/tools/memleak -a,就不会报错,但是里面并没有和app相关函数
    2. free观察情况如下,新机器,并没有任何其他高占用内存的进程,很是奇怪
    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
     r b swpd free buff cache si so bi bo in cs us sy id wa st
     1 0 0 218244 112044 463144 0 0 21 31 148 344 1 0 99 0 0
     0 0 0 218268 112044 463144 0 0 0 0 168 402 0 1 99 0 0
     0 0 0 217928 112044 463144 0 0 0 7 182 427 1 0 99 0 0
     0 0 0 217836 112044 463228 0 0 23 0 317 730 1 1 98 0 0
     0 0 0 217836 112048 463236 0 0 0 17 186 437 1 0 99 0 0
     0 0 0 215804 112052 463232 0 0 0 19 202 476 1 1 98 0 0
     0 0 0 215860 112052 463240 0 0 0 5 221 490 1 1 99 0 0
     0 0 0 217040 112056 463244 0 0 0 15 207 481 1 0 99 0 0
     0 0 0 217040 112056 463244 0 0 0 0 156 363 0 0 100 0 0
     0 0 0 76976 112056 463296 0 0 24 12 221 546 11 3 86 0 0
     0 0 0 77008 112060 463316 0 0 0 11 178 407 1 1 98 0 0
     0 0 0 75140 112060 463324 0 0 0 27 176 812 2 3 95 0 0
     0 0 0 74584 112060 463328 0 0 0 7 174 819 1 1 98 0 0
     0 0 0 74616 112060 463332 0 0 0 0 183 417 0 0 99 0 0
     0 0 0 216884 112060 463332 0 0 0 83 176 403 1 0 98 1 0
     0 0 0 216884 112064 463328 0 0 0 9 180 448 0 1 99 0 0
     0 0 0 217012 112064 463336 0 0 0 4 193 452 0 1 99 0 0
    展开

    作者回复: 看一下内核配置开启CONFIG_UPROBE_EVENTS了吗?

    
     1
  • Vicky🐣🐣🐣
    2019-02-23
    老师,很多同学都问这个问题了,麻烦解答一下吧
    ubuntu 4.15.0-29
    # /usr/share/bcc/tools/memleak -a -p 21642
    Attaching to pid 21642, Ctrl+C to quit.
    perf_event_open(/sys/kernel/debug/tracing/events/uprobes/p__lib_x86_64_linux_gnu_libc_2_27_so_0x97070_21642_bcc_21882/id): Input/output error
    Traceback (most recent call last):
      File "/usr/share/bcc/tools/memleak", line 416, in <module>
        attach_probes("malloc")
      File "/usr/share/bcc/tools/memleak", line 406, in attach_probes
        pid=pid)
      File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 989, in attach_uprobe
        raise Exception("Failed to attach BPF to uprobe")
    Exception: Failed to attach BPF to uprobe
    展开

    作者回复: 内核中需要开启 CONFIG_UPROBE_EVENTS=y

    
     1
  • 元天夫
    2019-02-22
    还有一个很low的问题,Linux version 2.6.32-504.23.4.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11),这个是我查看的内核信息,这个显示内核版本是4.4.7对吗?

    作者回复: 4.4.7是Red Hat产品的版本,内核版本是2.6.32

     1
     1
  • 仲鬼
    2019-01-04
    老师好,之前哪节课讲过pmap?并没有找到

    作者回复: 没有专门讲它的使用方法,不过很容易查到它的使用手册

    
     1
  • 夜空中最亮的星(华仔...
    2019-01-02
    老师,代码段里面可否把 代码前面的 $ 或 # 号,去掉。带着还的手动去掉下才能执行代码

    作者回复: 还是需要留着,去掉就不容易区分注释、命令和输出了

    
     1
  • 划时代
    2019-01-02
    memleak好像要比valgrind进行内存泄漏检测要方便很多。

    作者回复: 是的

    
     1
  • code2
    2019-01-01
    防止内存泄露,在c中最好让malloc和free成对出现,不要在函数中分配,在函数外释放,这样一不留神就忘了,检查时也不容易发现。也可使用一些源代码内存泄露检测工具。在C++中除了成对出现外还要注意new和delete使用的一些要点。曾遇到过一个投资数千万的大项目,java做的,因内存泄露不能查明原因,服务器不得不每月杀掉服务进程,重新启动。
    
     1
  • 黄智寿
    2019-01-01
    请问老师,对于golang或者python之类的进程有没有相应的工具分析内存泄露
    
     1
我们在线,来聊聊吧