歡迎您光臨本站 登入註冊首頁

使用 GDB 調試 uCLinux 內核

admin @ 2014-03-25 , reply:0

概述

   慢慢的大家的uClinux都可以跑起來了,也能夠自己編譯一個內核出來了。但是,如果自己要寫驅動、或者修改內核的一些代碼、或者像nickmit一樣要自己寫一個內核的移……

    慢慢的大家的 uClinux 都可以跑起來了,也能夠自己編譯一個內核出來了。但是,如果自己要寫驅動、或者修改內核的一些代碼、或者像 nickmit 一樣要自己寫一個內核的移植,那麼調試就是不可或缺的了。在這裡我摸索了一個使用我們廉價的 Wiggler + GDB + OCDLibremote 來調試內核的方法。
    關於 Wiggler 和 GDB 在這裡我就不介紹了,說一下 Cygwin 和 OCDLibRemote 吧。
    唉……其實 Cygwin 也沒什麼好說的,現在網路是那麼樣的發達,如果不知道那是什麼東西的話,大家到他的網站看一下就知道了。網址:
http://www.cygwin.com
    關於安裝的話,如果你僅僅是用來調試,那麼照它默認最小的來配置就可以了。如果還要自己編譯一點東西的話,那麼 Cliff 在這裡向你推薦幾個需要安裝的軟體包:
autoconf
automake
make
gcc
g++
gdb
msgfmt
bison
flex
gawk
sed
只要安裝了這些,一般編譯一些東西就沒有什麼問題了。
   這是一個使用 Wiggler (當然還有一些其他的 JTAG,如 Raven)的調試器,支持 GDB。大家可以到他的官方網站 http://www.macraigor.com/full_gnu.htm 下載所需要的軟體。很可惜的是,只有 Windows 下的 OCDLibRemote 才支持我們的廉價 JTAG——Wiggler。因此雖然那裡有 Linux 版本的,卻是不能用的(除非你有他支持的其他模擬器,如 Raven)。
    安裝了這個東西之後,似乎是不能直接運行的,他的驅動程序居然沒有裝好(我沒試過重啟一下是否就可以用,但是……我實在是太性急了)。因此我們需要手工安裝它的驅動,使用 loaddrv 之類的,它的 sys 文件倒是已經放到了 Windows 的 System32/drivers 目錄下了。
    不過建議大家可以試一試重啟之後能不能正常運行。
    如果對這個手工安裝驅動沒有概念的話,沒關係,我們可以在他的網站下載另一個軟體:OCD Commander 。它的網址是 http://www.macraigor.com/ocd_cmd.htm 。只要安裝了這個,它倒是要你重啟的,然後就可以用我們的 OCDLibRemote 了。
    這樣軟體安裝好了之後,那麼我們還需要一份 GDB。如果大家環境比較好,那麼可以在 Windows 的機器上運行 OCDLibRemote,然後在 Linux 的機器上開發和調試內核。如果只有一台機器(比如我,這樣的人應該還是大部分吧),那就需要編譯一份 Cgywin 下面的 GDB(或者 Insight,GDB 的圖形界面)。
    現在的 GDB/Insight 版本是 6.1,但是在 Cygwin 下面 Insight 不能被正確編譯。所以如果大家是初學者的話建議使用 Insight 6.0。
    關於編譯 GDB/Insight,我們首先需要下載它的源代碼,這裡以 GDB 6.1 為例子:

它的源代碼的文件名是 gdb-6.1.tar.bz2 或者 gdb-6.1.tar.gz。下載了這個東西以後(可以在ftp://sources.redhat.com/pub 下載):
tar xjvf gdb-6.1.tar.bz2   (tar xzvf gdb-6.1.tar.gz)
mkdir arm-elf-gdb
cd arm-elf-gdb
../gdb-6.1/configure --target=arm-elf
make
make install
如果嫌文件太大,可以使用 strip 命令把調試信息去掉:
strip /usr/local/bin/arm-elf-gdb.exe

開發環境配置好以後,就切入“如何調試”的正題了(我這個人……似乎廢話永遠比正經的話多啊……)

運行 OCDLibRemote。執行命令 OCDLibRemote -c ARM7 -d WIGGLER 就好了。
運行 arm-elf-gdb:
進入 linux 的目錄,例如 uClinux-dist/linux-2.4.x
請注意,你的 Linux 內核在編譯的時候需要選擇加入調試信息。在配置內核的時候,是在 Kernel hacking 裡面選中:
[*] Include debugging information in kernel binary

$ arm-elf-gdb linux
(gdb) target remote localhost:8888
Remote debugging using localhost:8888
0x00000000 in ?? ()
(gdb) c
Continuing.

如果你使用了我們新版本的 BIOS,那麼請在執行 c 命令之後到超級終端看一下,因為需要在 10 秒鐘內按鍵進入 BIOS。
進入 BIOS,使用 load 命令把我們的內核鏡像 image.ram 下載到 RAM 中(這個我就不多說了吧)。

之後,我們需要設置斷點(這才叫調試嘛)。請注意,斷點必須是在 load 之後設置,因為軟體斷點其實是通過改寫 RAM 來實現的。如果先設

置斷點再 load 那就俗了——斷點的特殊指令被衝掉了。

如下所示:
Auto boot in progress, press any key in 9 seconds to run BIOS...

>load
Now begin address for download, use address 0xc008000
Load image file from host
Type tftp -i 192.168.111.8 put filename at the host PC
Press ESC key to exit
Begin to receive filename: image.ram, transtype: octet.
Begin to receive filename: image.ram, transtype: octet.
TFTP transfer finished, and receive 1ab9b8 bytes.

為了設置斷點,我們要暫停 BIOS,這可以通過在 GDB 窗口按 CTRL+C 來實現。然後就可以設置斷點。如下:
(gdb) target remote localhost:8888
Remote debugging using localhost:8888
0x00000000 in ?? ()
(gdb) c
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0c7c0774 in ?? ()
(gdb) br start_kernel
Breakpoint 1 at 0xc008588: file init/main.c, line 363.

之後繼續運行,還是使用 c 命令,並且在 BIOS 使用 run 命令執行內核:
(BIOS)
>run
Run program from 0xc008000, are you aure? [y/n]y
(GDB)

(gdb) c
Continuing.

Breakpoint 1, start_kernel () at init/main.c:363
363             setup_arch(&command_line);
(gdb)

然後就是如何調試的問題了。


[admin via 研發互助社區 ] 使用 GDB 調試 uCLinux 內核已經有2303次圍觀

http://cocdig.com/docs/show-post-42232.html