kmemleak工具查询内存泄露,该如何解决?

bufferman0823 2018-10-30 09:14:14
内核代码为4.18 请问 遇到如下情况该如何去寻再找对应的泄露点????
越具体越好,第一次寻找,只知道从没有对Kmalloc进行释放,即没有对应的kfree。但对于实际的事情发生还是读不懂以下代码的上下文 请高手帮忙找一下!!!!


[color=#3366FF]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
[/color]




...全文
235 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
kmemleak在扫瞄的时候,泄露的内存已经不被人引用了,申请该块的代码也早就执行过了,也就只是能找到这一块内存没人管了而已,不能帮你定位到泄露点,只能告诉你有泄露,至于泄露点,自己可以在内存申请的地方加日志,把申请的地址打印到日志,那么配合kmemleak的扫瞄结果,可以定位,当然要好好找日志来对应才行,别的好方法,我也不知道,也许有吧
bufferman0823 2018-11-01
  • 打赏
  • 举报
回复
如何加日志呢? 比如我找到内存申请的地址为:
内核路径:net/netfilter/nf_conntrack_core.c

1128 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 */
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;


具体加那句话 能告知吗 ?
printk("ct =%x\n" ct) ; ????

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧