调试linux内核总览

来源:互联网 发布:谢霆锋会做菜吗 知乎 编辑:程序博客网 时间:2024/06/05 03:23

1. 内核自带的trace方法:

    a. 直接在内核中添加printk()调用。

    c. Oops, 基本上是用来显示内核出错的瞬间寄存器的内容。参见内核文档.kernel-Oops.txt

2. 无源内核调试器:

    a. kdb,使用SysRq键中断后,进行内核内存和寄存器的检查。需要在内核源码上打kdb补丁。也可以用一个串口终端程序。

    b. Kprobes, 通过编写一个简单的module,获取任何内核数据结构。 使用Alt+SysRq+W键可以启用kprobed的module,进行内核内存和寄存器的检查。2.5.26以上内核内置Kprobes支持,不需打补丁。

        需要配置:

                  CONFIG_KPROBES=y

                  CONFIG_MAGIC_SYSRQ=y

       module例程:


 3. 源码级内核调试器:

a. kgdb。需要两台电脑,使用串口线或网线连接。需要在内核添加补丁。支持硬件断点。kgdb无法调试启动阶段的内核。

1. 设置两台机器的串口速度:

            stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
2. 测试:

开发机:echo hello > /dev/ttyS0

        目标机:cat /dev/ttyS0 #目标机显示hello
3.  编译内核需要带调试符号,内核不能进行代码优化,如-O2。

4. 内核启动参数:kgdbwait将使kgdb在内核执行第一个内核线程时停下来,scheuler或init。

串口方式:kgdbwait kgdb8250=1,115200   # 端口号,速度

网口方式:kgdbwait kgdboe=@192.168.0.2/,@192.168. 0.3/  # local(target),remote(dev)

5.  开始调试:

gdb
file vmlinux                      # 源码目录的未压缩内核,有符号
set remotebaud 115200
target remote /dev/ttyS0

b. SkyEye。一个开发板或类似虚拟机的硬件模拟器,内置gdb的支持。非常适合调试内核,多用于调试嵌入式系统。配置过程较繁琐。

c. UML。即(User Mode Linux,用户模式Linux),就是作为应用程序运行的linux内核。>=2.6.9的内核内置UML,不需要打补丁。但要选择进行编译。在arch/um下。

1. gdb vmlinux,然后run就可以调试。

2. UML无法访问物理硬件,不适合开发驱动。但适合Linux内核其他方面的调试,比如启动,内存管理,调度。等等。

 

注:除了修改内核Makefile文件外,直接使用CONFIG_DEBUG_INFO=y,就可以产生内核调试符号=-g.

原创粉丝点击