Linux内核驱动开发之KGDB单步调试内核


如何单步调试Linux内核一直困扰着linux驱动开发人员,内核有其代码量大、逻辑复杂、与硬件交互的特性。因此,有着不同于应用程序的调试方法,据统计Linux内核开发者使用最普遍的调试方法是printk方法,而其他的方法大多是在特殊情况下才会使用。本文介绍的Kgdb调试方法是一种源码级的Linux内核调试器。使用Kgdb调试内核时,需要结合gdb一起使用,使用他们可以对内核进行单步调试,设置断点,观察变量、寄存器的值等与应用调试相关的功能。然而也有其限制条件,将在接下来Kgdb调试器原理来讲述,本文仅简单介绍使用Kgbd的流程。

Kgdb调试原理及kgdboe方式配置请参阅博文《Linux内核驱动开发之KGDB原理介绍及kgdboe方式配置》。

    关键步骤:
 
一、配置Linux内核,使其支持KGDB。
 
    依次进行如下配置:
 
    $make menuconfig(下面配置为必须进行的)

    Kernel hacking--->
          -*- Magic SysRq key
          [*] Kernel debugging
          [*] Compile the kernel with debug info
          [*] KGDB: kernel debugging with remote gdb --->
                  <*> KGDB: use kgdb over the serial console

(注意:博主已在内核中对KGDB进行串口驱动支持,方法请参考《嵌入式Linux应用开发完全手册》相关章节 见 )

配置成功后进行Linux内核的编译。make uImage并生成uImage拷贝到nfs/tftp服务器,等待u-boot下载内核或者直接烧到flash从flash上启动。

二、修改u-boot的启动参数bootargs以支持kgdb调试:

setenv bootargs 'console=ttyS0,115200n8 kgdboc=ttyS0,115200 kgdbwait …… nfsroot=……'

主要增加以上红色字体部分,指定kgdb使用开发板上的哪个串口,注意这里是串口名而不是设备文件/dev/ttyS0。

三、配置虚拟机与PC机的串口映射。如博主的Vmware虚拟机使用usb转串口到linux下串口设备名为/dev/ttyS1。可以通过mincom进行实际测试。

四、在虚拟机linux系统下使用minicom启动开发板的内核:方法如下:

tftp进行下载内核                 

OMAP3_EVM # tftp
smc911x: detected LAN9220 controller
smc911x: phy initialized  #by guoqingbo
smc911x: MAC 02:01:05:96:02:01
Using smsc911x-0 device
TFTP from server 192.168.1.93; our IP address is 192.168.1.94
Filename 'uImage'.
Load address: 0x82000000
Loading: #################################################################
        #################################################################
        #################################################################
        #################################################################
        #################################################################
        #################################################################
        #################################################################
        ##########################
done
Bytes transferred = 2459200 (258640 hex)

使用bootm启动linux后会在下面输出信息处停下,等待gdb的连接:

Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
serial8250.0: ttyS0 at MMIO 0x4806a000 (irq = 72) is a ST16654
console [ttyS0] enabled  #by guoingbo
serial8250.1: ttyS1 at MMIO 0x4806c000 (irq = 73) is a ST16654
serial8250.2: ttyS2 at MMIO 0x49020000 (irq = 74) is a ST16654
kgdb: Registered I/O driver kgdboc.
kgdb: Waiting for connection from remote gdb...

截图来说明一下:

  • 1
  • 2
  • 下一页

相关内容