mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-03 23:40:14 +08:00
PUB:20140718 Linux Kernel Testing and Debugging 3
@bazz2
This commit is contained in:
parent
2fac83eef5
commit
100557ea7b
@ -1,4 +1,4 @@
|
||||
Linux 内核测试与调试 - 3
|
||||
Linux 内核测试与调试(3)
|
||||
================================================================================
|
||||
### 基本测试 ###
|
||||
|
||||
@ -27,7 +27,7 @@ Linux 内核测试与调试 - 3
|
||||
- dmesg -t -k
|
||||
- dmesg -t
|
||||
|
||||
下面的脚本运行了上面的命令,并且将输出保存起来,以便与老的内核的 dmesg 输出作比较(LCTT:老内核的 dmesg 输出在本系列的第一篇文章中有介绍)。然后运行 diff 命令,查看新老内核 dmesg 日志之间的不同。脚本需要输入老内核版本号,如果不输入参数,它只会生成新内核的 dmesg 日志文件后直接退出,不再作比较(LCTT:话是这么说没错,但点开脚本一看,没输参数的话,这货会直接退出,连新内核的 dmesg 日志也不会保存的)。如果 dmesg 日志有新的警告信息,表示新发布的内核有漏网之鱼(LCTT:嗯,漏网之 bug 会更好理解些么?),这些 bug 逃过了自测和系统测试。你要看看,那些警告信息后面有没有栈跟踪信息?也许这里有很多问题需要你进一步调查分析。
|
||||
下面的脚本运行了上面的命令,并且将输出保存起来,以便与老的内核的 dmesg 输出作比较(LCTT:老内核的 dmesg 输出在本系列的[第二篇文章][3]中有介绍)。然后运行 diff 命令,查看新老内核 dmesg 日志之间的不同。这个脚本需要输入老内核版本号,如果不输入参数,它只会生成新内核的 dmesg 日志文件后直接退出,不再作比较(LCTT:话是这么说没错,但点开脚本一看,没输参数的话,这货会直接退出,连新内核的 dmesg 日志也不会保存的)。如果 dmesg 日志有新的警告信息,表示新发布的内核有漏网之“虫”,这些 bug 逃过了自测和系统测试。你要看看,那些警告信息后面有没有栈跟踪信息?也许这里有很多问题需要你进一步调查分析。
|
||||
|
||||
- [**dmesg 测试脚本**][1]
|
||||
|
||||
@ -67,40 +67,40 @@ ktest 是一个自动测试套件,它可以提供编译安装启动内核一
|
||||
|
||||
failslab (默认选项)
|
||||
|
||||
产生 slab 分配错误。作用于 kmalloc(), kmem_cache_alloc() 等函数(LCTT:产生的结果是调用这些函数就会返回失败,可以模拟程序分不到内存时是否还能稳定运行下去)。
|
||||
> 产生 slab 分配错误。作用于 kmalloc(), kmem_cache_alloc() 等函数(LCTT:产生的结果是调用这些函数就会返回失败,可以模拟程序分不到内存时是否还能稳定运行下去)。
|
||||
|
||||
fail_page_alloc
|
||||
fail\_page\_alloc
|
||||
|
||||
产生内存页分配的错误。作用于 alloc_pages(), get_free_pages() 等函数(LCTT:同上,调用这些函数,返回错误)。
|
||||
> 产生内存页分配的错误。作用于 alloc_pages(), get_free_pages() 等函数(LCTT:同上,调用这些函数,返回错误)。
|
||||
|
||||
fail_make_request
|
||||
fail\_make\_request
|
||||
|
||||
对满足条件(可以设置 /sys/block//make-it-fail 或 /sys/block///make-it-fail 文件)的磁盘产生 IO 错误,作用于 generic_make_request() 函数(LCTT:所有针对这块磁盘的读或写请求都会出错)。
|
||||
> 对满足条件(可以设置 /sys/block//make-it-fail 或 /sys/block///make-it-fail 文件)的磁盘产生 IO 错误,作用于 generic_make_request() 函数(LCTT:所有针对这块磁盘的读或写请求都会出错)。
|
||||
|
||||
fail_mmc_request
|
||||
fail\_mmc\_request
|
||||
|
||||
对满足条件(可以设置 /sys/kernel/debug/mmc0/fail_mmc_request 这个 debugfs 属性)的磁盘产生 MMC 数据错误。
|
||||
> 对满足条件(可以设置 /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]
|
||||
- fail\_page_alloc=
|
||||
- fail\_make\_request=
|
||||
- mmc\_core.fail\_request=[interval],[probability],[space],[times]
|
||||
|
||||
fault-injection 套件提供接口,以便增加新的功能。下面简单介绍下增加新功能的步骤,详细信息请参考上面提到过的文档:
|
||||
|
||||
使用 DECLARE_FAULT_INJECTION(name) 定义默认属性;
|
||||
使用 DECLARE\_FAULT\_INJECTION(name) 定义默认属性;
|
||||
|
||||
> 详细信息可查看 fault-inject.h 中定义的 struct fault_attr 结构体。
|
||||
> 详细信息可查看 fault-inject.h 中定义的 struct fault\_attr 结构体。
|
||||
|
||||
配置 fault 属性,新建一个 boot 选项;
|
||||
|
||||
> 这步可以使用 setup_fault_attr(attr, str) 函数完成,为了能在系统启动的早期产生错误,添加一个 boot 选项这一步是必须要有的。
|
||||
> 这步可以使用 setup\_fault\_attr(attr, str) 函数完成,为了能在系统启动的早期产生错误,添加一个 boot 选项这一步是必须要有的。
|
||||
|
||||
添加 debugfs 属性;
|
||||
|
||||
> 使用 fault_create_debugfs_attr(name, parent, attr) 函数,为新功能添加新的 debugfs 属性。
|
||||
> 使用 fault\_create\_debugfs\_attr(name, parent, attr) 函数,为新功能添加新的 debugfs 属性。
|
||||
|
||||
为模块设置参数;
|
||||
|
||||
@ -108,7 +108,7 @@ fault-injection 套件提供接口,以便增加新的功能。下面简单介
|
||||
|
||||
添加一个钩子函数到错误测试的代码中。
|
||||
|
||||
> should_fail(attr, size) —— 当这个钩子函数返回 true 时,用户的代码就应该产生一个错误。
|
||||
> should\_fail(attr, size) —— 当这个钩子函数返回 true 时,用户的代码就应该产生一个错误。
|
||||
|
||||
应用程序使用这个 fault-injection 套件可以指定某个具体的内核模块产生 slab 和内存页分配的错误,这样就可以缩小性能测试的范围。
|
||||
|
||||
@ -116,9 +116,10 @@ fault-injection 套件提供接口,以便增加新的功能。下面简单介
|
||||
|
||||
via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2
|
||||
|
||||
译者:[bazz2](https://github.com/bazz2) 校对:[校对者ID](https://github.com/校对者ID)
|
||||
译者:[bazz2](https://github.com/bazz2) 校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出
|
||||
|
||||
[1]:http://linuxdriverproject.org/mediawiki/index.php/Dmesg_regression_check_script
|
||||
[2]:http://elinux.org/Ktest#Git_Bisect_type
|
||||
[3]:http://linux.cn/article-3629-1.html
|
Loading…
Reference in New Issue
Block a user