Linux 内核测试与调试(3)

基本测试

安装好内核后,试试能不能启动它。能启动的话,检查 dmesg 看看有没有隐藏的错误。试试下面的功能:php

  • 网络(Wifi 或者网线)是否可用?html

  • ssh 是否可用?linux

  • 使用 ssh 远程传输文件。git

  • 使用 git clone 和 git pull 命令。github

  • 用用网络浏览器。浏览器

  • 查看 email。网络

  • 使用 ftp, wget 等软件下载文件。ssh

  • 播放音频视频文件。函数

  • 连上 USB 鼠标等设备。工具

检查内核日志

使用 dmesg 查看隐藏的问题,对于定位新代码带来的 bug 是一个好方法。通常来讲,dmesg 不会输出新的 crit, alert, emerg 级别的错误信息,也不该该出现新的 err 级别的信息。你要注意的是那些 warn 级别的日志信息。请注意 warn 这个级别的信息并非坏消息,新代码带来新的警告信息,不会给内核带去严重的影响。

  • dmesg -t -l emerg

  • dmesg -t -l crit

  • dmesg -t -l alert

  • dmesg -t -l err

  • dmesg -t -l warn

  • dmesg -t -k

  • dmesg -t

下面的脚本运行了上面的命令,而且将输出保存起来,以便与老的内核的 dmesg 输出做比较(LCTT:老内核的 dmesg 输出在本系列的第二篇文章中 有介绍)。而后运行 diff 命令,查看新老内核 dmesg 日志之间的不一样。这个脚本须要输入老内核版本号,若是不输入参数,它只会生成新内核的 dmesg 日志文件后直接退出,再也不做比较(LCTT:话是这么说没错,但点开脚本一看,没输参数的话,这货会直接退出,连新内核的 dmesg 日志也不会保存的)。若是 dmesg 日志有新的警告信息,表示新发布的内核有漏网之“虫”,这些 bug 逃过了自测和系统测试。你要看看,那些警告信息后面有没有栈跟踪信息?也许这里有不少问题须要你进一步调查分析。

压力测试

执行压力测试的一个好办法是同时跑三四个内核编译任务。下载各类版本的内核,同时编译它们,并记录时间。比较新内核跑压力测试和老内核跑压力测试所 花的时间,而后能够定位新内核的性能。若是新内核跑压力测试的时间比老内核的更长,说明新内核的部分模块性能退步了。性能问题很难调试出来。第一步是找出 哪里致使的性能退步。同时跑多个内核编译任务对检测内核总体性能来讲是个好方法,可是这种方法涵盖了多个内核模块,好比内存管理、文件系统、DMA、驱动 等(LCTT:也就是说,这种压力测试没办法定位到是哪一个模块形成了性能的降低)。

time make all

内核测试工具

咱们能够在 Linux 内核自己找到多种测试方法。下面介绍一个很好用的功能测试工具集: ktest 套件

ktest 是一个自动测试套件,它能够提供编译安装启动内核一条龙测试服务,也能够跑交叉编译测试,前提是你的系统有安装交叉编译所须要的软件。ktest 依赖于 flex 和 bison。详细信息请参考放在 tools/testing/ktest 目录下的文档,你能够自学成材。另外还有一些参考资料教你怎么使用 ktest:

tools/testing/selftests 套件

咱们来玩玩自测吧。内核源码的多个子系统都有本身的自测工具,到目前为止,断点、cpu热插拔、efivarfs、IPC、KCMP、内存热插拔、 mqueue、网络、powerpc、ptrace、rcutorture、定时器和虚拟机子系统都有自测工具。另外,用户态内存的自测工具能够利用 testusercopy 模块来测试用户态内存到内核态的拷贝过程。下面的命令演示了如何使用这些测试工具:

编译测试:

make -C tools/testing/selftests

测试所有:(有些测试须要 root 权限,你须要以 root 用户登入系统而后运行命令)

make -C tools/testing/selftests run_tests

只测试单个子系统:

make -C tools/testing/selftests TARGETS=vm run_tests

tools/testing/fault-injection 套件

在 tools/testing 目录下的另外一个测试套件是 fault-injection。failcmd.sh 脚本用于检测 slab 和内存页分配器的错误。这些工具能够测试内核可否很好地从错误状态中恢复回来。这些测试须要用到 root 权限。下面简单介绍了一些当前能提供的错误检测方法。随着错误检测方法的增长,这份名单也会不断增加。最新的名单请参考 Documentation/fault-injection/fault-injection.txt 文档。

failslab (默认选项)

产生 slab 分配错误。做用于 kmalloc(), kmemcachealloc() 等函数(LCTT:产生的结果是调用这些函数就会返回失败,能够模拟程序分不到内存时是否还能稳定运行下去)。

fail_page_alloc

产生内存页分配的错误。做用于 allocpages(), getfree_pages() 等函数(LCTT:同上,调用这些函数,返回错误)。

fail_make_request

对知足条件(能够设置 /sys/block//make-it-fail 或 /sys/block///make-it-fail 文件)的磁盘产生 IO 错误,做用于 generic_make_request() 函数(LCTT:全部针对这块磁盘的读或写请求都会出错)。

fail_mmc_request

对知足条件(能够设置 /sys/kernel/debug/mmc0/fail_mmc_request 这个 debugfs 属性)的磁盘产生 MMC 数据错误。

你能够本身配置 fault-injection 套件的功能。fault-inject-debugfs 内核模块在系统运行时会在 debugfs 文件系统下面提供一些属性文件。你能够指定出错的几率,指定两个错误之间的时间间隔,固然本套件还能提供更多其余功能,具体请查看 Documentation/fault-injection/fault-injection.txt。 Boot 选项可让你的系统在 debugfs 文件系统起来以前就能够产生错误,下面列出几个 boot 选项:

  • failslab=

  • fail_page_alloc=

  • fail_make_request=

  • mmc_core.fail_request=[interval],[probability],[space],[times]

fault-injection 套件提供接口,以便增长新的功能。下面简单介绍下增长新功能的步骤,详细信息请参考上面提到过的文档:

使用 DECLARE_FAULT_INJECTION(name) 定义默认属性;

详细信息可查看 fault-inject.h 中定义的 struct fault_attr 结构体。

配置 fault 属性,新建一个 boot 选项;

这步可使用 setup_fault_attr(attr, str) 函数完成,为了能在系统启动的早期产生错误,添加一个 boot 选项这一步是必需要有的。

添加 debugfs 属性;

使用 fault_create_debugfs_attr(name, parent, attr) 函数,为新功能添加新的 debugfs 属性。

为模块设置参数;

为模块添加一些参数,对于配置错误属性来讲是一个好主意,特别是当新功能的应用范围受限于单个内核模块的时候(LCTT:不一样内核,你的新功能可能须要不一样的测试参数,经过设置参数,你的功能能够没必要为了迎合不一样内核而每次都从新编译一遍)。

添加一个钩子函数到错误测试的代码中。

should_fail(attr, size) —— 当这个钩子函数返回 true 时,用户的代码就应该产生一个错误。

应用程序使用这个 fault-injection 套件能够指定某个具体的内核模块产生 slab 和内存页分配的错误,这样就能够缩小性能测试的范围。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2

译者:bazz2 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

 

来源: linuxjournal

    原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2         做者: Shuah Khan

        译者: bazz2

               

本文是原创投递或翻译投递,Linux中国首发地址:http://linux.cn/article-3630-1.html

欢迎转载,敬请在正文中标注并保留原文/译文连接和做者/译者等信息

相关文章
相关标签/搜索