我正在调试我的内核模块,它似乎有一个内存损坏,基本上是由alloc_netdev()分配给'net_device‘实例的一块内存已经损坏。
1)我在内核的.config中打开了CONFIG_DEBUG_KERNEL,CONFIG_DEBUG_SLAB,CONFIG_DEBUG_KMEMLEAK,但是不确定从kmemleak能得到什么。每当我读取/sys/kernel/debug/kmemleak时,它是否应该打印出疑似内存泄漏的跟踪转储?有没有办法重置kmemleak累积的统计/信息?最重要的一点--有人能帮助破译输出吗,例如:
unreferenced object 0xc625e000 (size 2048):
comm "swapper", pid 1, jiffies 4294937521
backtrace:
[<c00c89f0>] create_object+0x11c/0x200
[<c00c6764>] __kmalloc_track_caller+0x138/0x178
[<c01d78c0>] __alloc_skb+0x4c/0x100
[<c01d8490>] dev_alloc_skb+0x18/0x3c
[<c0198b48>] eth_rx_fill+0xd8/0x3fc
[<c019ac74>] mv_eth_start_internals+0x30/0xf8
[<c019c5fc>] mv_eth_start+0x70/0x244
[<c019c810>] mv_eth_open+0x40/0x64
[<c01e00f0>] dev_open+0xb4/0x118
[<c01df788>] dev_change_flags+0x90/0x168
[<c001a3e4>] ip_auto_config+0x1bc/0xecc
[<c00212f4>] do_one_initcall+0x5c/0x1bc
[<c00083d0>] kernel_init+0x8c/0x108
[<c0022f58>] kernel_thread_exit+0x0/0x8
[<ffffffff>] 0xffffffff2)我还想知道我是否可以在这个内存上应用一些“只读”属性,这样当有人试图修改内存时,我希望生成Oops。这听起来合理吗?
感谢您的建议,谢谢。
标记
发布于 2012-10-18 15:11:00
要捕获不正确的内存访问,KAsan或kmemcheck可能更有用。但是请注意,众所周知,Kmemcheck会招致重大损失,这有时可能是不可接受的,因此由您决定。KASan应该要快得多。
关于
中进行了详细描述
简而言之,它更可靠地执行
echo scan > /sys/kernel/debug/kmemleak作为根用户在读取/sys/kernel/debug/kmemleak之前立即触发内存分析。有时,我发现在阅读kmemleak的报告之前执行上述命令两次会更可靠。
要“重置”kmemleak收集的数据,您可以执行以下命令
echo clear > /sys/kernel/debug/kmemleak您发布的输出意味着kmemleak认为在该工具上次分析内存时,地址0xc625e000处的2Kb内存区域尚未被释放。回溯指定内存分配的位置。"swapper“是分配了该内存区域的进程的名称。
注意,我上面提到的kmemcheck使用了一种有点类似的技术来跟踪内存访问:使页面“看起来”就像它们不存在一样,这样每次对它们的访问都会导致页面错误,等等。详细信息通常在kernel docs中。
https://stackoverflow.com/questions/12943906
复制相似问题