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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34770510/article/details/78027160
  第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 动态探针

猜你喜欢

转载自blog.csdn.net/qq_34770510/article/details/78027160