调试linux内核总览

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值