我正在调试文件系统损坏(有时我看到符号链接指向“安装后”),并在menuconfig(EXPERT
,KALLSYMS
,DEBUG_KERNEL
,DEBUG_VM
,DEBUG_SLAB
,DEBUG_LIST
,DEBUG_MUTEXES
,CC_STACKPROTECTOR
,DEBUG_PAGEALLOC
,SLAB_STORE_USER
,等)中启用了通常的配置以尝试获取一些信息。这是一个3.18稳定的内核。
对于调试内核,在安装看起来相关的rootfs时,我有时会看到这样的报告:
Slab corruption (Tainted: P W O ): kmalloc-32 start=ac526c20, len=32
000: 00 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b .kkkkkkkkkkkkkkk
Prev obj: start=ac526c00, len=32
000: 00 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a .ZZZZZZZZZZZZZZZ
010: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a a5 ZZZZZZZZZZZZZZZ.
Next obj: start=ac526c40, len=32
000: 00 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a .ZZZZZZZZZZZZZZZ
010: 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a a5 ZZZZZZZZZZZZZZZ.
我试图找出是什么代码分配或释放(返回到缓存)内存,或者类似的东西。
我用=y和=n进行了测试,但在dmesg中没有看到“Last user”信息(即kmalloc的堆栈),根据slab.c[1],如果内存块头有标志,则应该打印该信息。
我的问题是,如何才能让alloc堆栈显示在损坏报告中?
编辑:根据slub.txt[2],这可能只适用于slub。
[1]http://elixir.free-electrons.com/linux/v3.18.80/source/mm/slab.c#L1735
[2]https://www.kernel.org/doc/Documentation/vm/slub.txt
最佳答案
回答我自己的问题。荡妇会给你回溯和红区信息。我启用了SLUB
,SLUB_DEBUG
,CONFIG_SLUB_DEBUG_ON
。
BUG kmalloc-32 (Tainted: P O ): Redzone overwritten
INFO: Allocated in custom_read+0x2c/0x9c age=1 cpu=1 pid=2856
custom_read+0x2c/0x9c
vfs_read+0x84/0xec
SyS_read+0x4c/0x9c
ret_fast_syscall+0x0/0x4c
INFO: Freed in link_path_walk+0x594/0x770 age=1 cpu=1 pid=2856
path_lookupat+0x20/0x674
filename_lookup.isra.10+0x20/0x5c
user_path_at_empty+0x60/0x9c
...
它是一个off-by-one,将一个0放在下一个对象上,这个对象是一个inode->i\u名称。