linux-kernel - 如何确定 Linux 内核模块是否泄漏内存

标签 linux-kernel memory-management kernel-module

为了测试内核泄漏内存时的行为,我正在编写一个连续分配内存的内核模块,例如代码看起来像

int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL); 
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);

此代码位于 init_module 中。我有以下问题

  1. 如何判断代码是否存在内存泄漏? lsmod 并没有透露太多信息。
  2. 网上的教程只展示了init_module和exit_module中的代码。如果我希望在模块插入后退出前的一段时间内进行内存分配怎么办?
  3. 我是否可以编写仅在用户发出指令时才泄漏内存的代码,例如用户空间程序是否可以进行系统调用而导致模块内存泄漏?

最佳答案

如果您需要检查内核模块是否存在内存泄漏,并且您的机器是 x86 架构,您可以使用 KEDR system ,它包括一个内存泄漏检测器。

KEDR 不需要您重建内核。在线文档(例如,请参阅“入门”)描述了如何安装和使用 KEDR。简而言之,流程如下。

安装(从源代码):解压源存档 - cmake <...> - make - make install

在加载模块之前启动 KEDR:

$ kedr start <name_of_the_module_to_analyze> -f leak_check.conf

然后您可以加载模块并像往常一样使用它。卸载后,KEDR 会在 debugfs 中给你一个报告(通常 debugfs 挂载到 /sys/kernel/debug),例如:

$ cat /sys/kernel/debug/kedr_leak_check/info
Target module: "...", 
Memory allocations: 3
Possible leaks: 2
Unallocated frees: 0

来自 /sys/kernel/debug/kedr_leak_check/ 的文件 possible_leaks 提供有关每个泄漏内存块的信息(地址、大小、调用堆栈)。

最后,您可以停止 KEDR(请注意,/sys/kernel/debug/kedr_leak_check/ 将会消失):

kedr stop

如果您使用的系统不是 x86 架构,Kmemleak 也可能会有所帮助,尽管它使用起来有点困难。您可能需要将 CONFIG_DEBUG_KMEMLEAK 参数设置为“y”来重建内核。尽管如此,Kmemleak 也是一个非常有用的工具。请参阅Documentation/kmemleak.txt在内核源代码中了解详细信息。

关于linux-kernel - 如何确定 Linux 内核模块是否泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5910563/

相关文章:

linux - 查找哪个java程序被Linux OOM Killer杀死

objective-c - timeIntervalSinceDate 给出 exc_bad_access 或 autorelease 错误

python - Python内存安全吗?

ios - 发送到已释放实例的消息

c - 如何在设备驱动程序编程中添加用户空间头?

linux - 偏好顺序 - printk() vs dev_dbg() vs netdev_dbg()

linux-kernel - `ioctl`读写GPIO : invalid argument

linux-kernel - 如何设置 intel_idle.max_cstate=0 来禁用 c-states?

android - 在 Android 中,我可以在没有用户提示的情况下以编程方式将我的应用程序添加到 superuser.apk 列表吗?

c - 列出 linux 系统中所有内核任务的最通用方法是什么?