您的位置:首页 > 运维架构 > Linux

linux设备驱动程序第三版--第4章调试技术--读后总结

2017-09-19 10:30 288 查看
  第4章 调试技术

一 kernel hacking(内核开发)选项:

CONFIG_DEBUG_KERNEL

其他调试选项可用,状态是开的

CONFIG_DEBUG_SLAB

对内存分配函数的几类检查,找到内存覆盖和遗漏初始化的错误。内存分配字节传递给调用者设成0x5a(怪不得有时候别人用这个字节),在释放时为0x6b

CONFIG_DEBUG_PAGEALLOC

跟页有关,说满的页在释放时会被内核地址空间去除,这个选项会拖慢系统,但它能指出内存损坏的错误

CONFIG_DEBUG_SPINLOCK

捕捉对未初始化的自旋锁的操作

CONFIG_DEBUG_SPINLOCK_SLEEP

对有自旋锁时进入睡眠的检查

CONFIG_INIT_DEBUG

系统初始化或者模块加载后都被丢弃,这个选项激活了对代码的检查,防止代码在初始化后存取初始化时的内存

CONFIG_DEBUG_INFO

是激活gbd调试内核的选项之一,另一个是CONFIG_FRAME_POINTER

CONFIG_MAGIC_SYSRQ

激活“Magic_SysRq”键

CONFIG_DEBUG_STACKOVERFLOW

CONFIG_DEBUG_STACK_USAGE

能跟踪内核堆栈溢出

CONFIG_KALLSYMS

在内核启动时  是缺省激活的,可以不管这个选项,没有它,oops只能以16进制给你内核回溯

CONFIG_IKCONFIG

CONFIG_IKCONFIG_PROC

这2个选项在“Generl setup”菜单,使得完整的内核配置状态被建立到内核之中

CONFIG_ACPI_DEBUG

和ACPI(Advanced Configuration and Power Interface)相关调试信息

CONFIG_DEBUG_DRIVER

打开了驱动核心的调试信息,在本书14章具体查看

CONFIG_SCSI_CONSTANTS

详细的SCSI错误消息的信息

CONFIG_INPUT_EVBUG

在“Device drivers/Input devicesupport”打开输入事件的详细日志 ,和输入设备驱动有关

CONFIG_PROFILING

在“Profiling support”,通常在系统性能调整、内核挂起上有用

二  打印调试

内核里大多是printk函数调试,比如

printk(KERN_DEBUG "Here I am: %s:%i\n", __FILE__, __LINE__);

printk(KERN_CRIT "I'm trashed; giving up on %p\n", ptr);

可以打印出变量所在的行号

打印设备编号:

<linux/kdev_t.h> 中定义)用于这个目的

int print_dev_t(char *buffer, dev_t dev);

char *format_dev_t(char *buffer, dev_t dev);

三 用查询调试

背景:大量的用printk会拖慢系统速度

查询方法:有几个技术给驱动开发者来查询系统: 创建一个文件在 /proc 文件系统下, 使用 ioctl驱动方法, 借助 sysfs 输出属性. 使用 sysfs 需要不少关于驱动模型的背景知识. 在14 章讨论

3.1  使用/proc文件系统

在/proc下每个文件都绑定到一个内核函数上,例如:/proc/modules,常常返回当前已加载的模块列表

3.2  ioctl方法

是一个系统调用,作用于一个文件描述符

四  观察调试

有时候小问题可以通过观察用户空间应用程序的行为来追踪。有几个方法可以监视用户空间程序运行。

strace命令,如 strace ls /dev > /dev/scull0这些

五 调试系统故障

有时候故障还留在驱动里,我们可以用oops消息和系统挂起。

六  调试器和相关工具

6.1 使用gdb
这个要经常用到 

6.2 kdb内核调试器

6.3 kgdb补丁

6.4 用户模式linux移植 http://user-mode-linux.sf.net/ 更多信息

6.5 linux追踪工具
http://www.opersys.com/LTT
6.6 动态探针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: