初略的看了一下LDD3,发现其实linux内核的调试技术也不少,一个大致的方法有如下诸多种:
1、在内核的menuconfig中配置调试选项,典型的调试选项位于“kernel hacking”中,很多有用的调试选项CONFIG_DEBUG_SLAB/CONFIG_KALLSYMS......,这种方法比较明显的缺陷:内核体积变大,需要重编内核。
2、调试的万金油--打印,内核态用printk(用户态用printf),这种方法明显的优点是:门槛低,上手快,定位问题有帮助;明显缺点:要不断的加打印和重编内核。同时,要注意优先级的问题。另外,有个技巧就是通过编译宏来控制打印是否使能及使用用户态接口还是内核接口适配你自己的打印宏,从而方便调试。最后,注意内核打印printk有优先级的问题,7种优先级,用户可以根据需要进行配置,也可以通过proc/sys/kernel/printk动态修改设置。
3、通过proc文件系统动态来确认及获取内核一些状态信息。同时,用户也可以实现自己的proc文件,来获取自己想要的信息。
4、ioctl方法,其主要作用于文件描述符上,用户可以定制自己的命令及相应的动作机制,比较灵活。
5、监视调试,通过strace来跟踪系统调用的参数、消耗时间及调用顺序等,比较有用的一个跟踪工具。
6、oops信息分析。
7、魔术键sysrq。这种方法主要针对系统假死的状态比较有效。使用前需要动态配置,使用ALT+SysRQ+各个功能组合。
8、gdb调试内核,可以调试内核映像。
9、kdb内核调试。
10、kgdb调试,明显的缺点是需要两台机器,一台调试机,一台被调试机,通过串口调试。
11、UML(User-Mode Linux),简单的讲就是将linux作为一个用户进程进行调试,最大的缺点就是不能调试与硬件相关的功能,如驱动。
12、LTT,内核的一个补丁包。
13、Dprobe动态茶庄的一个工具。
14、指令断点kprobe,可以对内核的指令动态设置断点。
15、数据断点hw_breakpoint,可以对指令和数据都进行动态监控。
16、perf调试,这个工具社区在不断地更新,而且集成了很多工具具有的功能,后面这个工具要引起重视。
17、oprofile,其实这个工具主要对性能调试,采点关键的性能函数很有用。
18、内核热补丁,非常有用的利器,但可靠性是一个挑战性问题。
19、仿真器或模拟器,这绝对是定位问题的利器,有了他们,上面的一切调试工具都是浮云,呵呵。调试就像在VC窗口下调试一样轻松。
阅读(4704) | 评论(0) | 转发(1) |