网易视频云技术分享:UML调试Linux内核
概述
UML这里不是统一建模语言,而是UserMode Linux的偕媸蝾纱缩写,从字面上看,是在用户态运行linux内核,即将内核当作一个应用程序在跑,这样我们就可以用调试应用层程序的方法调试内核了,应用层的强大调试工具gdb就派上用场了。很多时候我们写内核代码,当遇到算法比较复杂但又不涉及底层结构的时候总是喜欢现在应用层实现并调试,然后在写到内核层。为什么,就是因为用户层调试比内核调试方便。但是UML的最大局限性就是不能调试硬件关联性强的代码,但是还是有很多方面可以应用的,比如调度算法、VFS等。用gdb像跟踪用户程序一样跟踪这样的代码,相信你一定非常感兴趣,那么让我们马上开始第一步:搭建一个UML测试环境。
安装下载编译内核代码
1.首先从网上下载你感兴趣的内核代码版本,比如我下载的版本是2.6.36.4。
2.编译内核:在真正进入编译之前(make linux ARCH=um之前),需要先进行内核配置,具体配置可参考下图所示:
等你正确输入用户名和密码以后,展现在你面前的就是一个用户态的linux系统了,你可以完成和普通操作系统的所有功能。
使用UML调试内核
搞清楚了如何使用UML以后,利用UML调试内核也就变得易如反掌了,我们使用的工具还是强大的GDB。使用GDB加载编译好的内核,然后设置断点,用法与gdb调试普通应用程序无异。这里不妨给出我的gdb调试截图:
解决办法:tell gdb toignore SIGSEGV:告诉gdb忽略SIGSEGV。在gdb命令框中输入:handle SIGSEGVnoprint nostop pass
问题2:Programreceived signal SIGTRAP, Trace/breakpoint trap. 0x08066a4c in get_signals () atarch/um/os-Linux/signal.c:284
解决办法:在gdb命令框中输入:handle SIGTRAPnostop noprint