linux 内核 调试技术

linux 内核 调试技术

ID:18129138

大小:137.50 KB

页数:33页

时间:2018-09-14

linux 内核 调试技术_第1页
linux 内核 调试技术_第2页
linux 内核 调试技术_第3页
linux 内核 调试技术_第4页
linux 内核 调试技术_第5页
资源描述:

《linux 内核 调试技术》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、linux内核调试技术关键词:linux  内核  调试技术                                          调试技术对于任何一位内核代码的编写者来说,最急迫的问题之一就是如何完成调试。由于内核是一个不与特定进程相关的功能集合,所以内核代码无法轻易地放在调试器中执行,而且也很难跟踪。同样,要想复现内核代码中的错误也是相当困难的,因为这种错误可能导致整个系统崩溃,这样也就破坏了可以用来跟踪它们的现场。本章将介绍在这种令人痛苦的环境下监视内核代码并跟踪错误的技术。4.1 通过打印调试最

2、普通的调试技术就是监视,即在应用程序编程中,在一些适当的地点调用printf显示监视信息。调试内核代码的时候,则可以用printk来完成相同的工作。4.1.1 printk在前面的章节中,我们只是简单假设printk工作起来和printf很类似。现在则是介绍它们之间一些不同点的时候了。其中一个差别就是,通过附加不同日志级别(loglevel),或者说消息优先级,可让printk根据这些级别所标示的严重程度,对消息进行分类。一般采用宏来指示日志级别,例如,KERN_INFO,我们在前面已经看到它被添加在一些打印语句的

3、前面,它就是一个可以使用的消息日志级别。日志级别宏展开为一个字符串,在编译时由预处理器将它和消息文本拼接在一起;这也就是为什么下面的例子中优先级和格式字串间没有逗号的原因。下面有两个printk的例子,一个是调试信息,一个是临界信息:printk(KERN_DEBUG"HereIam:%s:%i",__FILE__,__LINE__);printk(KERN_CRIT"I'mtrashed;givingupon%p",ptr);在头文件中定义了8种可用的日志级别字符串。KER

4、N_EMERG用于紧急事件消息,它们一般是系统崩溃之前提示的消息。KERN_ALERT用于需要立即采取动作的情况。KERN_CRIT临界状态,通常涉及严重的硬件或软件操作失败。KERN_ERR用于报告错误状态;设备驱动程序会经常使用KERN_ERR来报告来自硬件的问题。KERN_WARNING对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题。KERN_NOTICE有必要进行提示的正常情形。许多与安全相关的状况用这个级别进行汇报。KERN_INFO提示性信息。很多驱动程序在启动的时候,以这个级别打印出

5、它们找到的硬件信息。KERN_DEBUG用于调试信息。每个字符串(以宏的形式展开)代表一个尖括号中的整数。整数值的范围从0到7,数值越小,优先级就越高。没有指定优先级的printk语句默认采用的级别是DEFAULT_MESSAGE_LOGLEVEL,这个宏在文件kernel/printk.c中指定为一个整数值。在Linux的开发过程中,这个默认的级别值已经有过好几次变化,所以我们建议读者始终指定一个明确的级别。根据日志级别,内核可能会把消息打印到当前控制台上,这个控制台可以是一个字符模式的终端、一个串口打印机或是一

6、个并口打印机。如果优先级小于console_loglevel这个整数值的话,消息才能显示出来。如果系统同时运行了klogd 和syslogd,则无论console_loglevel为何值,内核消息都将追加到/var/log/messages中(否则的话,除此之外的处理方式就依赖于对syslogd的设置)。如果klogd没有运行,这些消息就不会传递到用户空间,这种情况下,就只好查看/proc/kmsg了。变量console_loglevel的初始值是DEFAULT_CONSOLE_LOGLEVEL,而且还可以通过sy

7、s_syslog系统调用进行修改。调用klogd时可以指定-c开关选项来修改这个变量,klogd的man手册页对此有详细说明。注意,要修改它的当前值,必须先杀掉klogd,再加-c选项重新启动它。此外,还可以编写程序来改变控制台日志级别。读者可以在O’Reilly的FTP站点提供的源文件miscprogs/setlevel.c里找到这样的一段程序。新优先级被指定为一个1到8之间的整数值。如果值被设为1,则只有级别为0(KERN_EMERG)的消息才能到达控制台;如果设为8,则包括调试信息在内的所有消息都能显示出来。

8、如果在控制台上工作,而且常常遇到内核错误(参见本章后面的“调试系统故障”一节)的话,就有必要降低日志级别,因为出错处理代码会把console_loglevel增为它的最大数值,导致随后的所有消息都显示在控制台上。如果需要查看调试信息,就有必要提高日志级别;这在远程调试内核,并且在交互会话未使用文本控制台的情况下,是很有帮助的。从2.1.31这个版本起,可以通

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。