`
hulianwang2014
  • 浏览: 689917 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

Linux device drives chapter 4(调试技术)

 
阅读更多

第四章 内核调试技术

内核调试技术支持

make menuconfig对内核进行配置

在kernel hacking这一项中包含了一些内核的调试支持

makemenuconfig之后就会看到kernel hacking选项


一些内核调试选项有如下说明:(通过搜索找到的)

CONFIG_DEBUG_KERNEL -> kernel hacking->Kernel debugging
这个选项只是使其他调试选项可用; 它应当打开, 但是它自己不激活任何的特性.
CONFIG_DEBUG_SLAB -> kernelhacking->Debug slab memory allocations
这个重要的选项打开了内核内存分配函数的几类检查; 激活这些检查, 就可能探测到一些内存覆盖和遗漏初始化的错误. 被分配的每一个字节在递交给调用者之前都设成 0xa5, 随后在释放时被设成 0x6b. 你在任何时候如果见到任一个这种"坏"模式重复出现在你的驱动输出(或者常常在一个 oops 的列表), 你会确切知道去找什么类型的错误. 当激活调试, 内核还会在每个分配的内存对象的前后放置特别的守护值; 如果这些值曾被改动, 内核知道有人已覆盖了一个内存分配区, 它大声抱怨. 各种的对更模糊的问题的检查也给激活了.
CONFIG_DEBUG_PAGEALLOC -> kernelhacking->Debug page memory allocations
满的页在释放时被从内核地址空间去除. 这个选项会显著拖慢系统, 但是它也能快速指出某些类型的内存损坏错误.
CONFIG_DEBUG_SPINLOCK -> kernelhacking->Spinglock and rw-lock debugging:basic checks
激活这个选项, 内核捕捉对未初始化的自旋锁的操作, 以及各种其他的错误( 例如 2 次解锁同一个锁 ).
CONFIG_DEBUG_SPINLOCK_SLEEP -> kernel hacking->Spinglock debugging:sleep-inside-spinlockchecking
这个选项激活对持有自旋锁时进入睡眠的检查. 实际上, 如果你调用一个可能会睡眠的函数, 它就抱怨, 即便这个有疑问的调用没有睡眠.
CONFIG_INIT_DEBUG
用__init (或者 __initdata) 标志的项在系统初始化或者模块加载后都被丢弃. 这个选项激活了对代码的检查, 这些代码试图在初始化完成后存取初始化时内存.
CONFIG_DEBUG_INFO -> kernelhacking->Compile the kernel with debug info
这个选项使得内核在建立时包含完整的调试信息. 如果你想使用 gdb 调试内核, 你将需要这些信息. 如果你打算使用 gdb, 你还要激活 CONFIG_FRAME_POINTER.
CONFIG_MAGIC_SYSRQ -> Kernel-->hacking Magic SysRq key
激活"魔术 SysRq"键. 我们在本章后面的"系统挂起"一节查看这个键.
CONFIG_DEBUG_STACKOVERFLOW -> General setup -->Check forstack overflows
CONFIG_DEBUG_STACK_USAGE -> kernel hacking->Stackutilization instrumentation
这些选项能帮助跟踪内核堆栈溢出. 堆栈溢出的确证是一个 oops 输出, 但是没有任何形式的合理的回溯. 第一个选项给内核增加了明确的溢出检查; 第 2 个使得内核监测堆栈使用并作一些统计, 这些统计可以用魔术 SysRq 键得到.
CONFIG_KALLSYMS -> General setup -->Configure standard kernel features(for smallsystems)--->Load all symbols for debugging/ksymoops
这个选项(在"Generl setup/Standard features"下)使得内核符号信息建在内核中;缺省是激活的. 符号选项用在调试上下文中; 没有它, 一个 oops 列表只能以 16 进制格式给你一个内核回溯, 这不是很有用.
CONFIG_IKCONFIG -> Generalsetup -->Kernel .config support
CONFIG_IKCONFIG_PROC
这些选项(在"Generl setup"菜单)使得完整的内核配置状态被建立到内核中, 可以通过 /proc 来使其可用. 大部分内核开发者知道他们使用的哪个配置, 并不需要这些选项(会使得内核更大). 但是如果你试着调试由其他人建立的内核中的问题, 它们可能有用.
CONFIG_ACPI_DEBUG -> Powermanagement and ACPI options -->ACPI (Advanced Configuration and PowerInterface) Support-->Debug Statements
在"Power management/ACPI"下. 这个选项打开详细的ACPI (Advanced Configuration and Power Interface) 调试信息, 它可能有用如果你怀疑一个问题和 ACPI 相关.
CONFIG_DEBUG_DRIVER -> DeviceDrivers-->Generic Driver Options-->Driver Core verbose debug message
在"Device drivers"下. 打开了驱动核心的调试信息,可用以追踪低层支持代码的问题. 我们在第 14 章查看驱动核心.
CONFIG_SCSI_CONSTANTS -> Device Drivers-->SCSI device support-->Verbose SCSI error reporting (kernel size +=12K)
这个选项, 在"Device drivers/SCSI device support"下, 建立详细的 SCSI 错误消息的信息. 如果你在使用 SCSI 驱动, 你可能需要这个选项.
CONFIG_INPUT_EVBUG -> DeviceDrivers-->Input device support--->Event debugging
这个选项(在"Device drivers/Input device support"下)打开输入事件的详细日志. 如果你使用一个输入设备的驱动, 这个选项可能会有用. 然而要小心这个选项的安全性的隐含意义: 它记录了你键入的任何东西, 包括你的密码.
CONFIG_PROFILING -> Generalsteup--->OProfile system profiling(EXPERIMENTAL)
这个选项位于"Profiling support"之下. 剖析通常用在系统性能调整,但是在追踪一些内核挂起和相关问题上也有用.

通过打印日志

printk通过附加不同的日志级别,可让printk根据这些消息的严重性程度对消息进行分类。表示的日志级别的宏会展开围一个字符串,在编译的时候由预处理器将他和消息文本拼接在一起。

KERN_EMERG:用于紧急事件消息,他们一般用于系统崩溃之前的提示消息

KERN_ALERT:用于需要立即采取动作的情况。

KERN_CRIT:临界状态,通常涉及严重的硬件或者软件操作错误。

KERN_ERR:报告硬件错误

KERN_WARNING:对可能出现的问题进行警告

KERN_NOTICE:有必要进行提示的正常情况

KERN_INFO:提示信息,用于打印出他们找到的硬件信息

KERN_DEBUG:用于调试

当优先级小于console_loglevel的时候才会显示出来,console_loglevel初始值是KERN_WARNING,可以通过klog –c 来改变

可参考如下代码

void __init chr_dev_init(void)
{
         dev_tdev;
         dev= MKDEV(200, 0);
         if(register_chrdev(200,"leok", &chr_dev) != -1)
         {
                   printk(KERN_CRIT"registerchr_dev success\n");
         }
         else
         {
                   printk(KERN_ALERT"registerchr_dev failed\n");
         }
         printk(KERN_EMERG"chr_devinitialize and acccess\n");
         return;
}


自己先搞了一个内核源码

wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.tar.bz2

本来是想搞一下2.6.38的内核代码,但是内核有bug,make的时候编译不通过

出现如下问题:

arch/x86/kernel/entry_32.S: Assemblermessages:

arch/x86/kernel/entry_32.S:1422: Error:.size expression does not

evaluate to a constant make[3]: ***[arch/x86/kernel/entry_32.o]

Error 1

最后的解释是:

kernel的维护者说,这是一个已知的bug:

http://groups.google.com/group/linux.kernel/browse_thread/thread/c3ed96dd55b5e930

之后wget了2.6.34内核代码

进入到自己wget 源码的目录,然后make menuconfig 出现了,如下问题:

the ncurses libraries找不到,之后采取的办法是:

sudoapt-get install libncurses5-dev 自己安装一个这个库。

linux驱动基础开发3——linux 内核配置机制(makemenuconfig、Kconfig、makefile)讲解

http://blog.csdn.net/gooogleman/article/details/7312195

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics