我正在调试文件系统损坏(有时我看到符号链接指向“安装后”),并在menuconfig(EXPERTKALLSYMSDEBUG_KERNELDEBUG_VMDEBUG_SLABDEBUG_LISTDEBUG_MUTEXESCC_STACKPROTECTORDEBUG_PAGEALLOCSLAB_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

最佳答案

回答我自己的问题。荡妇会给你回溯和红区信息。我启用了SLUBSLUB_DEBUGCONFIG_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名称。

10-04 11:17