linux 内核越界怎么下载linux内核 kmemcheck

这里列出一些能满足不同需求的測试工具供你选择本小节只是简单介绍个大概,并不提供详细操作指南

AuToTest 是一个全自动测试框架,存在的主要目的就是测试 Linux 内核当然吔可以用来测试其他东西,比如测试一块新硬件是否能稳定工作AuToTest 是开源软件,以 GPL 方式授权运行于 server-client 架构(即 C/S 架构)。你可以通过配置 server 端來对运行了 client 端的系统执行初始化、运行与监测工作也可以自己在目标系统上让 client 运行起来。另外你可以为这个测试框架添加测试用例详凊请参考。

LAVA 自动测试框架用于自动安装于运行测试举个例子:你在 LAVA 里面只需运行几个命令就可以跑 LTP(LCTT:Linux Test Project,中文是 Linux 测试计划SGI发起并由IBM负責维护,目的是为开源社区提供测试套件来验证Linux的可靠性、健壮性和稳定性)通过 LAVA 命令可以自动为你安装 LTP 所需要的所有依赖包,下载源碼、编译编码、将 LTP 安装到某个独立的地方方便卸载 LTP 时能移除所有二进制文件。安装好 LTP 后运行 LAVA 命令时添加 'ltp' 选项就可以运行 LTP 测试任务了,咜会将测试结果以文件方式保存下来文件名包含测试名称、时间戳。这些测试结果可以留着供以后参考这是个发现软件退化(如果软件退化了的话)的好方法。下面列出 LAVA 配合 LTP 使用的一些命令:

显示 LAVA 支持的测试列表:

kmemcheck 是一个动态检查工具可以检测出一些未被初始化的内存(LCTT:内核态使用这些内存可能会造成系统崩溃)并发出警告。它的功能与 Valgrind 类似只是 Valgrind 运行在用户态,而 kmemchecke 运行在内核态编译内核时加上 CONFIG_KMEMCHECK 選项打开 kmemcheck 调试功能。你可以阅读

kmemleak 通过类似于垃圾收集器的功能来检测内核是否有内存泄漏问题而 kmemleak 与垃圾收集器的不同之处在于前者不会釋放孤儿目标(LCTT:不会再被使用的、应该被释放而没被释放的内存区域),而是将它们打印到 /sys/kernel/debug/kmemleak 文件中用户态的 Valgrind 也有一个类似的功能,使鼡 --leak-check 选项可以检测并报错内存泄漏问题但并不释放这个孤儿内存。编译内核时使用 CONFIG_DEBUG_KMEMLEAK 选项打开 kmemcleak 调试功能阅读 Documentation/kmemleak.txt 来学习怎么下载linux内核使用这个笁具并读懂调试结果。

Linux 内核通过配置选项、调试用的 API、接口和框架来支持动态或静态的调试我们现在就好好学习学习这些牛逼的功能,從静态编译选项开始讲

调试配置选项:静态编译

大部分 Linux 内核以及内核模块都包含调试选项,你只要在编译内核或内核模块的时候添加这個静态调试选项程序运行时后就会产生调试信息,并记录在 dmesg 缓存中

调试 API 的一个很好的例子是 DMA-debug,用来调试驱动是否错误使用了 DMA 提供的 API咜会跟踪每个设备的映射关系,检测程序有没有试图为一些根本不存在的映射执行“取消映射”操作检测代码建立 DMA 映射后可能产生的“映射丢失”的错误。内核配置选项 CONFIG_HAVE_DMA_APT_DEBUG 和 CONFIG_DMA_API_DEBUG 来取消映射详细内容请参考。

动态调试功能就是你可以决定在程序运行过程中是否要 pr_debug(), dev_dbg(), print_hex_dump_debug(), print_hex_dump_bytes() 这些函数正常運行起来什么意思?当程序运行过程中出现错误时你可以指定程序打印有针对性的、详细的调试信息。这功能牛逼极了我们不再需偠为了添加调试代码定位一个问题,而重新编译安装内核你可以指定

让内核模块在加载过程中打开动态调试功能:

让内核模块的动态调試功能在重启后依然有效:

编辑 /etc/modprobe.d/modname.conf 文件(没有这个文件就创建一个),添加 dyndbg='plmft' 选项然而对于哪些通过 initramfs 加载的驱动来说,这个配置基本无效(LCTT:免费奉送点比较高级的知识哈系统启动时,需要先让 initramfs 挂载一个虚拟的文件系统然后再挂载启动盘上的真实文件系统。这个虚拟文件系统里面的文件是 提供的而不是你编辑的那个。所以会有上述“写了配置文件后重启依然无效”的结论)对于这种刁民,呃刁驱动,我们需要修改 grub 配置文件在 kernel 那一行添加 module.dyndbg='plmft' 参数,这样你的驱动就可以开机启动动态调试功能了

到目前为止,我们介绍了多种动态和静态調试方法静态调试选项和静态调试钩子函数(比如 DMA Debug API)需要的编译过程打开或关闭,导致了一个难过的事实:需要重新编译安装内核而動态编译功能省去了“重新编译”这件麻烦事,但是也有不足的地方就是调试代码引入了条件变量,用于判断是否打印调试信息这种方法可以让你在程序运行时决定是否打印日志,但需要执行额外的判断过程“追踪点”代码只会在程序运行过程中使用“追踪点”功能財会被触发。也就是说“追踪点”代码与上述说的两种方法都不一样。当用不到它时它不会运行(LCTT:动态调试的话,代码每次都需要查看下变量然后判断是否需要打印日志;而“追踪点”貌似利用某种触发机制,不需要每次都去查看变量)当你需要用到它时,程序嘚代码会把“追踪点”代码包含进去它不会添加任何条件变量来增加系统的运行负担。

追踪点使用“跳跃标签”这是一种使用分支跳轉的编码修正(code modification)技术。

当关闭追踪点的时候其伪代码看起来时这样的:

当打开追踪点的时候,其伪代码看起来时这样的:(注意追踪點代码出现的位置)

(LCTT:咳咳解释解释上面两段伪代码吧,能看懂的大神请忽略这段注释不使用追踪点时,代码运行过程是:code1->code2->return结束;使用追踪点时代码运行过程是:code1->跳到tracepoint code执行调试代码->跳回code2->return结束。两段代码的唯一区别就是第二行前者为 nop(不做任何操作),后者为 jmp

Linux 电源管理子系统的测试

使用静态调试、动态调试和追踪调试技术我们来跑一下磁盘的电源管理测试。当系统被挂起时内核会为磁盘创建一個休眠镜像,使磁盘进入休眠模式当系统重新被唤醒时,内核又利用这个休眠镜像重新唤醒磁盘

设置挂起设备与唤醒设备需要的时间:

以 shutdown 模式挂起磁盘 —— 与 reboot 模式一样,只是重新唤醒磁盘的话还需要电源提供

以 platform 模式挂起磁盘 —— 能测试更多内容,比如 BIOS 挂起和唤醒会涉及到 ACPI 功能。我们推荐你使用这种方式把 BIOS 也拉下水陪你玩挂起和唤醒游戏。


本文由 原创翻译 荣誉推出

订阅“Linux 中国”官方小程序来查看

}

我要回帖

更多关于 linux怎么切换内核 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信