内核代码为4.18 请问 遇到如下情况该如何去寻再找对应的泄露点????
越具体越好,第一次寻找,只知道从没有对Kmalloc进行释放,即没有对应的kfree。但对于实际的事情发生还是读不懂以下代码的上下文 请高手帮忙找一下!!!!root@intel-x86-64:/sys/kernel/debug# echo scan > kmemleak
backtrace:
unreferenced object 0xffff9195e2b23400 (size 256):
  comm "softirq", pid 0, jiffies 4347625846 (age 11.014s)
  hex dump (first 32 bytes):
    01 00 00 00 00 00 00 00 0e 00 00 00 00 00 00 00  ................
    77 22 00 00 00 00 00 00 d8 89 46 ee 95 91 ff ff  w"........F.....
  backtrace:
    [<0000000006fd5d99>] kmem_cache_alloc+0x146/0x200
    [<000000006286cd07>] __nf_conntrack_alloc.isra.13+0x4d/0x170 [nf_conntrack]
    [<000000007c6c2493>] init_conntrack+0x6a/0x2f0 [nf_conntrack]
    [<00000000d25914e8>] nf_conntrack_in+0x2c5/0x360 [nf_conntrack]
    [<00000000da4b0506>] ipv4_conntrack_in+0x1c/0x20 [nf_conntrack_ipv4]
    [<00000000d3ecebfb>] nf_hook_slow+0x48/0xd0
    [<00000000614296ff>] ip_rcv+0x2cf/0x3ef
    [<000000003b23f1e8>] __netif_receive_skb_core+0x467/0xb70
    [<000000009dcd5a0e>] __netif_receive_skb+0x26/0x70
    [<000000008434533e>] netif_receive_skb_internal+0x53/0x150
    [<00000000032fa581>] napi_gro_receive+0x5f/0x110
    [<0000000025a1f512>] e1000_receive_skb+0x122/0x140
    [<0000000074b81d85>] e1000_clean_rx_irq+0x1e8/0x400
    [<000000009f7a3635>] e1000e_poll+0x81/0x2a0
    [<000000006a7c910e>] net_rx_action+0x12e/0x370
    [<000000006f9ad686>] __do_softirq+0xae/0x313

解决方案 »

  1.   

    kmemleak在扫瞄的时候,泄露的内存已经不被人引用了,申请该块的代码也早就执行过了,也就只是能找到这一块内存没人管了而已,不能帮你定位到泄露点,只能告诉你有泄露,至于泄露点,自己可以在内存申请的地方加日志,把申请的地址打印到日志,那么配合kmemleak的扫瞄结果,可以定位
      

  2.   

    如何加日志呢? 比如我找到内存申请的地址为:
    内核路径:net/netfilter/nf_conntrack_core.c1128                         net_warn_ratelimited("nf_conntrack: table full, dropping packet\n");
    1129                         return ERR_PTR(-ENOMEM);
    1130                 }
    1131         }
    1132 
    1133         /*
    1134          * Do not use kmem_cache_zalloc(), as this cache uses
    1135          * SLAB_TYPESAFE_BY_RCU.
    1136          */
    [color=#FF0000]1137         ct = kmem_cache_alloc(nf_conntrack_cachep, gfp);

    1138         printk("kmem_cache_alloc test\n");
    1139         printk("kmem_cache_alloc ct=%x\n",ct);
    1140         if (ct == NULL)
    1141                 goto out;
    1142 
    1143         spin_lock_init(&ct->lock);
    1144         ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig;
    [/color]具体加那句话 能告知吗 ?
    printk("ct =%x\n" ct) ;    ????