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 动态探针
一 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 动态探针
相关文章推荐
- Linux设备驱动程序(第三版)学习之内核的调试技术(三)_1
- Linux设备驱动程序(第三版)学习之内核的调试技术(三)_2_查询调试
- 《LINUX设备驱动程序》第4章(调试技术)学习笔记
- Linux设备驱动程序-调试技术
- Shell调试技术总结(二)
- STM32调试485(sp3485)技术总结
- 【原创】《Linux设备驱动程序》学习之循序渐进 --- 调试技术
- <逆向工程核心原理> 静态反调试技术总结
- PHP 调试技术总结
- 欲善其功,必先利其器--Nodejs调试技术总结
- Linux设备驱动程序第三版学习(3)- 调试
- linux内核驱动模块的调试技术总结
- <逆向工程核心原理> 动态反调试技术总结
- Linux设备驱动程序学习(2)-调试技术
- Linux设备驱动程序第三版学习(3)- 调试 .
- 【原创】《Linux设备驱动程序》学习之循序渐进 --- 调试技术
- 编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
- 反调试技术总结
- 反调试技术总结
- paip. 调试技术打印堆栈 uapi print stack java php python 总结.