linux 内核 调试 书,Linux内核设备驱动之内核的调试技术笔记整理

/****************** * 内核的调试技术 ******************/

(1)内核源代码中的一些与调试相关的配置选项

内核的配置选项中包含了一些与内核调试相关的选项,都集中在"kernel hacking"菜单中。包括:

CONFIG_DEBUG_KERNEL

使其他的调试选项可用,应该选中,其本身不会打开所有的调试功能。

具体的调试选项说明可参见驱动一书,或通过menuconfig的help说明查看。

(2)如何通过宏对printk调试语句进行全局控制

通过和Makefile配合,可以在c文件中定义属于我们自己的调试语句。

(3)strace的使用

strace可以跟踪由用户空间程序所发出的所有系统调用。有用的参数有:

-t  显示调用发生的时间

-T  显式调用所花费的时间

-e  限定被跟踪的系统调用类型,如"-e execve"

-f  跟踪所有子进程

-p  跟踪特定进程。如"-p 8856"

-o  将输出的信息导入特定的文件

strace对于发现系统调用时的细微错误非常有用,尤其是针对多进程的程序,可以通过strace输出的返回值和进程pid获得大量有用信息。如:

$>strace -o zht.txt -f ./process_create

(4)ltrace的使用

ltrace可以跟踪由用户空间程序所发出的所有动态库函数调用。有用的参数有:

-t  显示调用发生的时间

-T  显式调用所花费的时间

-f  跟踪所有子进程

-p  跟踪特定进程

-o  将输出的信息导入特定的文件

(5)查看oops消息

oops是内核告知用户有不幸发生的最常用方式。通常,发送完oops后,内核会处于一种不稳定状态。

在某些情况下,oops会导致内核混乱,而混乱的结果就是死机,这些情况可能包括:

*oops发生在持有锁的代码中

*oops发生在和硬件设备通讯的过程中

*oops在中断上下文中发生

*oops发生在idle进程(0)或init进程(1),因为内核没有这两个进程没法工作

如果oops在其他进程运行时发生,内核会杀死该进程并尝试着继续运行。oops的产生有很多原因,包括内存访问越界或非法指令等。

oops包含的最重要讯息是寄存器上下文和回溯线索(call trace)可以人为引起oops,如:

if(bad_thing) BUG(); //或 BUG_ON(bad_thing);

可以用panic()引发更严重的错误,调用panic()不但会打印错误信息,还会挂起整个系统。只有在极端恶劣的情况下才会使用:

if(terrible_thing) panic("foo is %ld!n", foo);

有些时候,只要打印一下栈信息就可以帮助测试,如dump_stack():

if(!debug_check){ printk(KERNEL_DEBUG "provide some infon"); dump_stack(); }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

linux内核调试分析指南 linux内核调试分析指南--上篇 本文档已经转到下面的网址,位于zh-kernel.org的文档停止更新,请访问新网址 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 skyeye的使用 UML的使用 vmware的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环境的建立 gdb基础 基本命令 gdb之gui gdb技巧 gdb宏 汇编基础--X86篇 用户手册 AT&T汇编格式 内联汇编 汇编与C函数的相互调用 调用链形成和参数传递 C难点的汇编解释 优化级别的影响 汇编基础--ARM篇 用户手册 调用链形成和参数传递 源码浏览工具 调用图生成工具 find + grep wine + SI global Source-Navigator vim + cscope/ctags kscope lxr SI等与gdb的特点 调用链、调用树和调用图 理想调用链 函数指针调用 调用链的层次 非理想调用链 调用树与调用图 穿越盲区 穿越gdb的盲区 穿越交叉索引工具的盲区 工程方法 bug 与 OOPS linux内核调试分析指南--下篇 ***第二部分:内核分析*** 内核组织层次和复杂度 内核层次 内核复杂度 复杂度隔离 gdb在内核分析中的用途 数据验证 界面剥离 参数记忆 路径快照 长程跟踪 整理思路 内核编码的艺术 信息聚集 数据聚集 关系聚集 操作聚集 松散聚集 顺序聚集 链表聚集 哈希聚集 树形聚集 分层聚集 分块聚集 对象聚集 设施客户 设备驱动模型分析 linux设备子系统的组成 设备驱动模型 usb子系统分析 如何阅读分析大型子系统 btrfs文件系统分析 区间树核心代码分析 B树核心代码分析 调试相关子系统 kgdb源码分析 sysrq oprofile kprobes 驱动分析 载入模块符号 ***第三部分:其他工具*** kexec strace ltrace SystemTap MEMWATCH YAMD Magic SysRq 附录:社区交流相关 补丁提交相关文档 补丁制作与提交示范 多补丁发送工具 git使用 Git公共库创建及使用 附录:内核参考书籍文章 内核git库 书籍 子系统官方网站 必看网站 参考文章 私人备忘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值