歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核驅動開發之KGDB單步調試內核

如何單步調試Linux內核一直困擾著linux驅動開發人員,內核有其代碼量大、邏輯復雜、與硬件交互的特性。因此,有著不同於應用程序的調試方法,據統計Linux內核開發者使用最普遍的調試方法是printk方法,而其他的方法大多是在特殊情況下才會使用。本文介紹的Kgdb調試方法是一種源碼級的Linux內核調試器。使用Kgdb調試內核時,需要結合gdb一起使用,使用他們可以對內核進行單步調試,設置斷點,觀察變量、寄存器的值等與應用調試相關的功能。然而也有其限制條件,將在接下來Kgdb調試器原理來講述,本文僅簡單介紹使用Kgbd的流程。

Kgdb調試原理及kgdboe方式配置請參閱博文《Linux內核驅動開發之KGDB原理介紹及kgdboe方式配置》。 http://www.linuxidc.com/Linux/2013-06/86406.htm

    關鍵步驟:
 
一、配置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應用開發完全手冊》相關章節 見 http://www.linuxidc.com/Linux/2011-01/31114.htm)

配置成功後進行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...

截圖來說明一下:

Copyright © Linux教程網 All Rights Reserved