Linux 内核的测试和调试(6)

Linux 内核的测试和调试(6)

Linux 内核补丁测试

你试过自己写内核补丁吗?本节介绍在把你的补丁包提交到 Linux 邮箱列表之前,需要做哪些操作。另外我们还会介绍如何把它发送出去。

写好代码后,编译它。把 make 过程产生的输出保存到文档中,查看新代码有没有警告信息。找到所有的警告信息,处理掉。当你的代码编译过程没有任何不正常的输出,安装这个内核,然后启动测试。如果启动正常,查看 dmesg 里面有没于错误,与老内核生成的 dmesg 日志做个比较。运行一些压力测试,请参考我们以前讲过的测试内容。如果这个补丁用于修复某个 bug,请确保真的已经修复了。如果真的修复了,请确保能通过系统测试。找出打你补丁的模块下面的回归测试工具,运行一下。如果补丁涉及到其他架构,你需要交叉编译然后测试一下。请通过下面的目录查找测试工具:

如果你对你的补丁测试结果感到很满意,你就可以提交补丁了。请确保提交 commit 的信息要描述得非常清楚。要让内核维护者和其他开发者看懂补丁所修改的内容,这一点非常重要。生成补丁后,执行 scripts/checkpatch.pl 脚本,找到 checkpatch 是产生的错误或警告(如果有的话),修复它们。重新生成补丁,直到补丁通过这个脚本的测试。重新测试这个补丁。将本补丁用于其他的内核源码上,保证不会有冲突产生。

现在你做好提交补丁的准备了。先运行 scriptst/get_maintainer.pl 来确认你应该把补丁发给哪个内核维护者。注意不要以附件形式发送补丁,而是以纯文本形式粘贴在邮件里面。确保你的邮件客户端可以发送纯文本信息,你可以试试给自己发送一份补丁邮件来测试你的邮件客户端的功能。收到自己的邮件后,运行 checkpatch 命令并给自己的内核源码打上你的补丁。如果这两部都能通过,你就可以给 Linux 邮箱列表发送补丁了。使用 git send-email 命令是提交补丁最安全的方式,可以避免你的邮箱的兼容性问题。你的 .gitconfig 文件里面需要配置好有效的 smtp 服务器,详细操作参考 git 的帮助文档。

更多提交补丁的规矩,请参考下面的资料:

  • linux_git/Documentation/applying-patches.txt
  • linux_git/Documentation/SubmitChecklist
  • linux_git/Documentation/SubmittingDrivers
  • linux_git/Documentation/SubmittingPatches
  • linuxgit/Documentation/stablekernel_rules.txt
  • linuxgit/Documentation/stableapi_nonsense.txt

下面是一些内核测试教程的资料:

内核测试套件和项目

除我们讨论过的测试资源之外,这里还有很多测试项目值得介绍,包括开源的和厂家自己提供的。这些项目每一个都是针对特定领域的,比如嵌入式或者企业自己使用。我们简单过一下。

Linux 测试项目(LTP)测试套件是一系列工具的集合,用于测试内核的可靠性、健壮性和稳定性。你可以为这个项目添加自己的测试代码,并且 LTP 项目欢迎你贡献自己的代码。runltp 脚本默认情况下会测试下面的子系统:

  • 文件系统压力测试
  • 磁盘 IO 测试
  • 内存管理压力测试
  • IPC(进程间通信)测试
  • 调度器测试
  • 命令的功能性验证测试
  • 系统调用功能验证测试

LTP-DDT 是一个基于 LTP 的测试应用(LCTT:就是 LTP 的阉割版么),专注于测试嵌入式设备驱动。

Linux Driver Verification 这个项目的目标是提高 Linux 设备驱动的质量,它为设备驱动验证开发了集成环境平台,并且利用与时俱进的研究来增强验证工具的质量。

一致性测试

如果你有将某个 Unix 平台下的应用一直到另一个平台的经验,你就能理解 Linux Standard Base (LSB) 和 LSB 一致性测试套件的重要性了。LSB 是 Linux Foundation 工作组创建的用于降低支持不同 Linux 平台所需要的开销,方法就是通过降低不同 Linux 发行版之间的差别,保证应用在不同发行版之间的可移植性。前事不忘后事之师,Unix 世界的分歧在 Linux 世界一定要避免。这就是为什么你可以把一个 rpm 包转化成 deb 包后还能安装并正常运行的秘密。

静态分析工具

静态分析之所以会被称为“静态分析”,是因为这些工具只分析代码,并不执行它们。分析 Linux 内核代码的静态分析工具有很多,Sparse 是 Linus Torvalds 写的专门用于检查内核静态类型的工具。它是一个语义检查器,会为 C 语言的语义建立语义检析树,执行惰性类型评估。内核编译系统支持 sparse,并且为编译内核的命令提供开启 sparse 的选项。

为内核所有需要重新编译的 C 文件执行 sparse 语义检查:


  1. make C=1 allmodconfig

为内核所有 C 文件(即使不需要重新编译)执行 sparse 语义检查:


  1. make C=2 allmodconfig

Sparse 的资源:

Smatch 分析程序代码的逻辑错误。它可以检测到诸如“为一个没锁上的 spinlock 执行解锁”的逻辑错误。内核源码支持 smatch:

在 Linux 内核中运行 smatch:


  1. make CHECK="~/path/to/smatch/smatch -p=kernel" C=1 bzImage modules | tee warns.txt

请参考下面的资料来获取和编译 smatch。需要注意的是 smatch 是个正在发展的项目,架构会不断变化。

那么我们该怎么处理 Sparse 和 Smatch 所发现的语义和逻辑上的错误呢?一些错误可以被分离为日常问题或模块问题,可以轻易被解决。但是有些语义错误涉及到全局,因为剪切粘贴了一些代码。在一些环境中,当一些接口函数被废弃不再使用,或者仅仅做了写微小的修改,你就需要大规模更新源码。这时候你需要 Coccinelle 来帮忙。,Coccinelle 使用 SmPL 语言(语义包语言)来为 C 代码提供匹配和转换代码的功能。Coccinelle 的从一开始就作为 Linux 的附属产品持续发展的。

举个例子:foo(int) 函数突然变成 foo(int, char *) 函数,多出了一个输入参数(可以把第二个参数置为 null)。所有调用 foo() 函数的代码都需要更新了,这可能是个悲摧的体力活。但是使用 Coccinelle 的话,这项工作瞬间变得轻松,脚本会帮你找到调用 foo(parameter1) 的代码,然后替换成 foo(parameter1, NULL)。做完这些后,所有调用这个函数的代码都可以运行一遍,验证下第二个参数为 NULL 是否能正常工作。

原文发布时间:2014-08-28

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-02 14:52:34

Linux 内核的测试和调试(6)的相关文章

Linux 内核的测试和调试(1)

Linux 内核的测试和调试(1) Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的.不可或缺的环节,Linux 内核也不例外.开发人员自测.系统测试.回归测试.压力测试,都有各自不同的目的,但是从更高一个层次上看,这些测试的最终目的又是一样的:保证软件能一直运行下去,当有新功能加进去时,要保证新功能可以正常工作. 在软件释出 release 版之前,不用回归测试就能保证稳定性,并且尽量避免在软件发布后被用户发现 bug.调试被用户发现的 bug 是一项非常浪

Linux 内核测试和调试(4)

Linux 内核测试和调试(4) 自动测试工具 这里列出一些能满足不同需求的测试工具供你选择.本小节只是简单介绍个大概,并不提供详细操作指南. AuToTest AuToTest 是一个全自动测试框架,存在的主要目的就是测试 Linux 内核,当然也可以用来测试其他东西,比如测试一块新硬件是否能稳定工作.AuToTest 是开源软件,以 GPL 方式授权,运行于 server-client 架构(即 C/S 架构).你可以通过配置 server 端来对运行了 client 端的系统执行初始化.运

Linux 内核测试和调试(5)

Linux 内核测试和调试(5) 仿真环境下进行 Linux 电源管理子系统测试 Linux 电源管理子系统在仿真环境下提供5种测试方式.这些方式仅仅在内核各层之间运行休眠的代码而不是真正的让系统进入休眠状态.有些平台不能挂起系统,比如说我们需要模拟飞机的飞行环境,这时候使用这种仿真环境就非常有用处了. freezer - 测试停掉处理器: echo freezer > /sys/power/pm_test echo platform > /sys/power/disk echo disk &

Linux 内核测试与调试(3)

Linux 内核测试与调试(3) 基本测试 安装好内核后,试试能不能启动它.能启动的话,检查 dmesg 看看有没有隐藏的错误.试试下面的功能: 网络(Wifi 或者网线)是否可用? ssh 是否可用? 使用 ssh 远程传输文件. 使用 git clone 和 git pull 命令. 用用网络浏览器. 查看 email. 使用 ftp, wget 等软件下载文件. 播放音频视频文件. 连上 USB 鼠标等设备. 检查内核日志 使用 dmesg 查看隐藏的问题,对于定位新代码带来的 bug 是

如何测试软件包在不同的linux内核版本上的兼容性?软件包基本上都是开源的,光测试POSIX行吗?

问题描述 如何测试软件包在不同的linux内核版本上的兼容性?软件包基本上都是开源的,光测试POSIX行吗? 客户要求评估用户态软件包在同步内核版本上的兼容性,软件包都是开源的,光测试POSIX可以吗?哪个大神能给些意见? 解决方案 从工程的角度来说,所有受支持的平台环境都要测试. 解决方案二: 都测试一下为好,万一有点不一样了 解决方案三: linux内核版本的迭代,对用户态接口的影响到底会有多大?

我用.net 开发的框架、网站在 linux下全部移植编译调试测试完毕,非常爽!

问题描述 我用.net开发的框架.网站在linux下全部移植编译调试测试完毕,非常爽!我快爽晕了,哈哈!特提供一个典型的测试网站供大家观摩http://wwww.bwsyq.com看清楚是4个w啊不能访问可以通过下面的地址进行访问由于是测试,所以用的是ADSL,IP地址经常变化,域名不能用可参考下面提供的最新的IP地址!用的是我的笔记本,带宽只有2MB!部署环境ubuntu10.10+mysql5.1+apache2+mono2.67开发环境ubuntu10.10+mono2.67+mono-d

使用 ftrace 调试 Linux 内核【转】

转自:http://blog.csdn.net/adaptiver/article/details/7930646 使用 ftrace 调试 Linux 内核,第 1 部分 http://blog.csdn.net/tommy_wxie/article/details/7340701 简介: ftrace 是 Linux 内核中提供的一种调试工具.使用 ftrace 可以对内核中发生的事情进行跟踪,这在调试 bug 或者分析内核时非常有用.本系列文章对 ftrace 进行了介绍,分为三部分.本文

VELT-0.1.5开发:使用kgdb调试Linux内核【转】

转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可以进行uboot和linux内核的编译,并根据编译时的错误信息正确定位到源码.目前的版本是0.1.4,仅

在Ubuntu上为Android系统内置C可执行程序测试Linux内核驱动程序

   在前一篇文章中,我们介绍了如何在Ubuntu上为Android系统编写Linux内核驱动程序.在这个名为hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello.proc系统文件/proc/hello和devfs系统属性文件/sys/class/hello/hello/val.进一步,还通过cat命令来直接访问/proc/hello和/sys/class/hello/hello/val文件来,以验证驱动程序的正确性.在这一篇文章