内核内存泄漏检测器

3
我已经在内核调试选项中启用了“Kernel memory leak detector”选项,并重新构建/重启系统,现在kmemleak文件存在于/sys/kernel/debug文件夹中,但似乎我无法通过“echo scan > /sys/kernel/debug/kmemleak”触发扫描。我已将debugfs挂载到/sys/kernel/debug上,但当我尝试触发扫描时,它会给出“-bash: echo: write error: Device or resource busy”的错误提示。我的猜测是,即使我是root用户,我也没有在/sys文件夹内的写入权限。有什么建议可以解决这个问题吗?非常感谢。
我已经尝试过:

如果kmemleak被禁用,kmemleak sysfs写处理程序将返回EBUSY。你是否通过echo命令将kmemleak关闭了?如果没有,Linux内核是否构建时使用了CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y?你是否尝试在Linux内核的bootargs/cmdline中传递kmemleak=on来启动? - TheCodeArtist
我没有关闭回显,CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF 没有设置(我已经检查了我的 .config 文件),而且我尝试过重启 "kmemleak=on" 并在重新启动后执行了 "echo scan > /sys/kernel/debug/kmemleak",但仍然出现相同的错误。 - Boooooo
1个回答

4

在使用kmemleak时需要检查几个方面。

检查是否传递了任何bootargs或命令行参数kmemleak=off

在您的引导日志中,检查是否有任何与kmemleak相关的日志,特别是以下日志内容。

kmemleak: Kernel memory leak detector disabled
kmemleak: Early log buffer exceeded (919), please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE

很可能,您需要配置CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE。如果在启动期间,kmemleak的日志大小超过了Linux内核配置中设置的限制,则会禁用kmemleak。

因此,请配置CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE并增加其大小。此选项也位于内核调试下。我正在使用内核源4.19.9,并附上参考的截图。 最大kmemleak早期日志条目是字段,您可能需要将其设置为较高的值(例如4096)。

enter image description here


顺便说一下,在5.5版本中,CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE被重命名为CONFIG_DEBUG_KMEMLEAK_MEM_POOL_SIZE。另外,我发现明确传递kmemleak=on解决了手头的问题... - kaiwan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接