本文转载自:http://blog.chinaunix.net/uid-26859697-id-5758037.html

分析完kmemleak实现后,照常实验一下,以确定功能正常。

如kmemcheck一样,该功能需要在内核开启的情况下才能够使用。主要的配置项有:CONFIG_DEBUG_KERNEL、CONFIG_HAVE_DEBUG_KMEMLEAK、CONFIG_DEBUG_KMEMLEAK,以及配置信息记录条数的CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE,通常情况下配置数量的可以不必修改,但是针对自启动初始化的模块,还是有必要进行调整的,以便记录更多的信息,避免遗漏。

以上几项的在make menuconfig编译配置内核时,配置路径如下:

Kernel hacking

+——>Kernel Debugging(该项需要开启)

+——>Memory Debugging

+——>Kernel memory leak detector(开启该项)

当然,这几项配置项是对其他配置项存在一定的依赖的,具体可以在make menuconfig反斜杠搜索对应配置项进行了解。

设置的过程中有几项需要特别注意的就是,在“Kernel memory leak detector”开启后展开的几项子项注意不要进行设置了,其中有:“Simple test for the kernel memory leak detector”和“Default kmemleak to off”。

例如实验中配置选项设置如下:

编译好内核之后,安装该调测版本的内核,重新启动linux系统,进入新内核。将会能够查看到/sys/kernel/debug/kmemleak该路径文件的存在。如果存在,则表明开启成功。

该实验仍使用64位系统做演示,修改前面kmemcheck的实验代码,构造内存泄漏。具体代码如下:

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/mm.h>
  4. #include <linux/slab.h>
  5. #include <asm/page.h>
  6. void kmemleak_memalloc(void)
  7. {
  8. char *pmem;
  9. pmem = kmalloc(300, GFP_KERNEL);
  10. if (!pmem)
  11. {
  12. printk("[Kmemleak]: kmalloc fail!\n");
  13. }
  14. else
  15. {
  16. printk("[Kmemleak]: kmalloc return %p \n", pmem);
  17. }
  18. }
  19. int __init kmemleak_test_init(void)
  20. {
  21. printk("[Kmemleak]: kmemleak_test_init! \n");
  22. kmemleak_memalloc();
  23. return 0;
  24. }
  25. void __exit kmemleak_test_exit(void)
  26. {
  27. printk("[Kmemleak]: kmemleak_test_exit now \n");
  28. }
  29. module_init(kmemleak_test_init)
  30. module_exit(kmemleak_test_exit)
  31. MODULE_LICENSE("GPL");

Makefile脚本稍作修改后:

  1. obj-m = kmemleak_test.o
  2. all:
  3. make -C /lib/modules/`uname -r`/build M=`pwd`
  4. clean:
  5. rm -f *.o *.ko *.mod.c modules.order Module.symvers

编译内核ko后,通过ismod命令安装模块,根据代码的编写打印的日志信息,通过dmesg进行确认模块初始化完毕且内存申请妥当。

相关信息如下:

为了保证实验的成功,ko安装完毕后,等待了几分钟后。

通过命令:echo scan > /sys/kernel/debug/kmemleak,进行内存扫描检测。检测结果将会在/sys/kernel/debug/kmemleak文件中记录。通过dmesg的信息可以看到申请的内存空间位于0xffff95c9bf81b600地址。搜索一下,便可以看到kmemleak中的信息记录:

kmemleak的检测结果信息中,清晰地记录了申请该内存的调用栈信息、内存头32byte的信息以及泄漏的内存地址及大小。但是这里的大小并不是一个很精确的大小,这里呈现的是一个slab内存片的大小,实验中申请的空间大小为300字节,对应为512字节的slab片。具体的结合代码进行分析部分就省略掉了,那是开发人员必备的基础能力,鄙人就不班门弄斧了。

接下来细述一下kmemleak的控制参数,控制kmemleak主要是通过往/sys/kernel/debug/kmemleak文件中写入参数。例如前面使能kmemleak进行内存泄漏扫描的命令是写入scan,具体的命令则是:echo scan > /sys/kernel/debug/kmemleak。而清除kmemleak的扫描结果使用的参数是clear,对应的命令是:echo clear > /sys/kernel/debug/kmemleak。

更多的kmemleak参数有:

  1. off - disable kmemleak (irreversible)
  2. stack=on - enable the task stacks scanning (default)
  3. stack=off - disable the tasks stacks scanning
  4. scan=on - start the automatic memory scanning thread (default)
  5. scan=off - stop the automatic memory scanning thread
  6. scan=<secs> - set the automatic memory scanning period in seconds
  7. (default 600, 0 to stop the automatic scanning)
  8. scan - trigger a memory scan
  9. clear - clear list of current memory leak suspects, done by
  10. marking all current reported unreferenced objects grey
  11. dump=<addr> - dump information about the object found at <addr>

如果要是测试内核模块,正确的操作步骤应为:

1、 清除kmemleak的历史信息,以便记录新数据:

#echo clear > /sys/kernel/debug/kmemleak

2、 加载需要测试的内核模块,并执行相关测试用例;

#ismod ***.ko

3、 使能kmemleak进行内存泄漏扫描:

#echo scan > /sys/kernel/debug/kmemleak

4、 查看分析扫描结果:

#cat /sys/kernel/debug/kmemleak

至此,实验完毕,kmemleak挺好用的,适用于内核模块开发用于检测定位内存泄漏问题。

Linux-3.14.12内存管理笔记【内存泄漏检测kmemleak示例】【转】的更多相关文章

  1. SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践

    培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...

  2. Linux-3.14.12内存管理笔记【伙伴管理算法(1)】

    前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的 ...

  3. Linux-3.14.12内存管理笔记【构建内存管理框架(1)】

    传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的.这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构).但是随 ...

  4. Linux-3.14.12内存管理笔记【伙伴管理算法(2)】

    前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作. 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): [file:/init/main. ...

  5. Linux-3.14.12内存管理笔记【构建内存管理框架(5)】

    前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充. 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系. 现着重分析一下各个管理结构体的成员功能作用. ...

  6. 2. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(2)】

    memory:表示可用可分配的内存: 结束完memblock算法初始化前的准备工作,回到memblock算法初始化及其算法实现上面.memblock是一个很简单的算法. memblock算法的实现是, ...

  7. 1. Linux-3.14.12内存管理笔记【系统启动阶段的memblock算法(1)】

    memblock算法是linux内核初始化阶段的一个内存分配器(它取代了原来的bootmem算法),实现较为简单.负责page allocator初始化之前的内存管理和分配请求. 分析memblock ...

  8. Linux-3.14.12内存管理笔记【构建内存管理框架(2)】

    前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建.此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable ...

  9. Linux 0.11源码阅读笔记-内存管理

    内存管理 Linux内核使用段页式内存管理方式. 内存池 物理页:物理空闲内存被划分为固定大小(4k)的页 内存池:所有空闲物理页组成内存池,以页为单位进行分配回收.并通过位图记录了每个物理页是否空闲 ...

随机推荐

  1. ASP.NET WebAPI 路由规则与POST数据 【转】

    http://www.cnblogs.com/liulun/archive/2012/06/20/2556556.html 蛋疼的路由规则约定 在上一篇文章中 我们成功通过AJAX获取到了服务器的数据 ...

  2. iOS动画中的物理知识应用之愤慨的小鸟-碰撞检測

    碰撞检測 源码:https://github.com/Esdeath/collsion 我相信搞iOS得人.多多少少都知道 弹球这个小游戏. 撞击不同的点,就能改变其运动的轨迹.对于非常多人来说,假设 ...

  3. 2014年辛星解读Javascript之DOM高速入门

    在Javascript的知识中,有一个所谓的DOM.即文档对象模型,我们能够通过它来訪问HTML文档的元素,当网页被载入的时候,浏览器会去创建DOM,有了这个DOM.我们能够使用Javascript去 ...

  4. NSIS隐藏窗体标题栏自带的button(最大化,最小化,关闭X)

    这个问题实在八月份逛csdn论坛的时候偶然遇到的,当时比較好奇楼主为啥要隐藏关闭button.就顺口问了下,结果楼主已经弃楼.未给出原因,猜着可能是为了做自己定义页面美化,无法改变按纽外观之类的,后来 ...

  5. 使用FDTemplateLayout框架打造个性App

    效果展示 project下载地址 · 进入构建结构 首先我们新建一个project 接下来我们拖进来一个Table View Controller,将Storyboard Entry Point指向我 ...

  6. p90x 涵盖了全部方式的健身方式美国经典训练DVD

    http://baike.baidu.com/view/2602721.htm  p90x是美国经典训练DVD, 涵盖了全部方式的健身方式13张Beachbody P90X DVD全集,90天魔鬼训练 ...

  7. Oracle SQL 查询优化.Part4

    一.插入 insert 操作: 1. 复制表结构但不新增数据: -- 复制表结构但不插入数据 create table emp_new as select * from emp where 1 = 2 ...

  8. IOS-4-面试题1:黑马程序猿IOS面试题大全

    一.多线程网络 1. 多线程的底层实现? 1> 首先搞清楚什么是线程.什么是多线程 2> Mach是第一个以多线程方式处理任务的系统.因此多线程的底层实现机制是基于Mach的线程 3> ...

  9. Gmail上不去怎么办?

    近期非常多人反映Gmail上不去.每到重大政治事件附近,国家的防火墙就会加固一些. 事实上仅仅要下一个软件就能够轻松解决Google.Gmail上不去的问题. 下载地址 下载解压后点击"我要 ...

  10. Linux下比较常用的svn命令

    svn: command not found yum install -y subversion 以下是一些常用命令的使用方法,希望对大家有所帮助. 1,check out(co)签出代码 test. ...