嵌入式開發(fā)交叉調(diào)試技術(shù)簡(jiǎn)介
本文主要介紹嵌入式開發(fā)環(huán)境中使用gdb交叉調(diào)試的大體過程。
在后面例子中給出了針對(duì)QtExtend環(huán)境中使用交叉調(diào)試的最簡(jiǎn)步驟。
主要內(nèi)容:
一、嵌入式中的交叉調(diào)試
二、交叉調(diào)試舉例
三、其他
一、嵌入式中的交叉調(diào)試
============================
遠(yuǎn)程調(diào)試環(huán)境由宿主機(jī)GDB和目標(biāo)機(jī)調(diào)試stub共同構(gòu)成,兩者通過串口或 TCP連接,使用GDB標(biāo)準(zhǔn)程串行協(xié)議協(xié)同工作,實(shí)現(xiàn)對(duì)目標(biāo)機(jī)上的系統(tǒng)內(nèi)核和上層應(yīng)用的監(jiān)控和調(diào)試功能,調(diào)試stub是嵌入式系統(tǒng)中的一段代碼,作為宿主機(jī)GDB和目標(biāo)機(jī)調(diào)試程序間的一個(gè)媒介而存在。
就目前而言,嵌入式Linux系統(tǒng)中,主要有三種遠(yuǎn)程調(diào)試方法,分別適用于不同場(chǎng)合的調(diào)試工作:用ROM Monitor調(diào)試目標(biāo)機(jī)程序、用KGDB調(diào)試系統(tǒng)內(nèi)核和用 gdbserver調(diào)試用戶空間程序,這三種調(diào)試方法的區(qū)別主要在于,目標(biāo)機(jī)遠(yuǎn)程調(diào)試stub 的存在形式的不同,而其設(shè)計(jì)思路和實(shí)現(xiàn)方法則是大致相同的。
而我們最常用的是調(diào)試應(yīng)用程序就是采用gdb+gdbserver的方式進(jìn)行調(diào)試,在很多情況下,用戶需要對(duì)一個(gè)應(yīng)用程序進(jìn)行反復(fù)調(diào)試,特別是復(fù)雜的程序采用GDB方法調(diào)試,由于嵌入式系統(tǒng)資源有限性,一般不能直接在目標(biāo)系統(tǒng)上進(jìn)行調(diào)試,通常采用gdb+gdbserver的方式進(jìn)行調(diào)試 gdbserver在目標(biāo)系統(tǒng)中運(yùn)行,GDB則在宿主機(jī)上運(yùn)行GDB調(diào)試,目標(biāo)系統(tǒng)必須包括gdbserver程序,宿主機(jī)也必須安裝GDB程序。一般 Linux發(fā)行版中都有一個(gè)可以運(yùn)行的GDB,但開發(fā)人員不能直接使用該發(fā)行版中的GDB 來做遠(yuǎn)程調(diào)試,而要獲取GDB的源代碼包,針對(duì)arm平臺(tái)作一個(gè)簡(jiǎn)單配置,重新編譯得到相應(yīng)GDB,GDB的源代碼包可以從 http: //ftp.cs.pu.edu.tw/linux/sourceware/gdb/releases/下載,最新版本為gdb-6.4,下載到某個(gè)目錄,假設(shè)用戶目錄:/home/vicky
下載完后,進(jìn)入/home/vicky目錄,配置編譯步驟如下:
#tar jxvf gdb-6.4-tar-bz2
#cd gdb-6.4
#./configure --target=arm-linux --prefix=/usr/local/arm-gdb -v
#make
這一步的時(shí)候可能會(huì)有問題,提示一個(gè)函數(shù)中(具體函數(shù)名不記得了)parse error,就是unsigned前邊多了一個(gè)”}”你用vi進(jìn)入那一行把它刪掉就行了
#make install
#export PATH=$PATH:/usr/local/arm-gdb
進(jìn)入gdbserver目錄:
#./configure --target=arm-linux --host=arm-linux
#make CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc
(這一步要指定arm-linux-gcc的位置)
沒有錯(cuò)誤的話就在gdbserver目錄下生成gdbserver可執(zhí)行文件,把它燒寫到flash的根文件系統(tǒng)分區(qū),或通過nfs mount的方式都可以,只要保證gdbserver能在開發(fā)板上運(yùn)行就行。
下面就可以用gdb+gdbserver調(diào)試我們開發(fā)板上的程序了在目標(biāo)板上運(yùn)行g(shù)dbserver,其實(shí)就是在宿主機(jī)的minicom下,我的 RedHat Linux裝在vmware下的,我是在minicom下#mount 192.168.2.100:/ /tmp后做的(這里參數(shù) -o nolock可以不加,不加這一步執(zhí)行得反而更快些),hello和gdbserver都是位于Linux根目錄下,把主機(jī)根目錄掛在到開發(fā)板的 /tmp 目錄下。
要進(jìn)行g(shù)db調(diào)試,首先要在目標(biāo)系統(tǒng)上啟動(dòng)gdbserver服務(wù)在gdbserver所在目錄下輸入命令:
(minicom下)
#cd /tmp
#./gdbserver 192.168.2.100:2345 hello
192.168.2.100為宿主機(jī)IP(這里我沒有加這個(gè)IP也管用),在目標(biāo)系統(tǒng)的2345端口開啟了一個(gè)調(diào)試進(jìn)程,hello為要調(diào)試的程序,
出現(xiàn)提示:
Process /tmp/hello created: pid=80
Listening on port 2345
(另一個(gè)終端下)
#cd /
#export PATH=$PATH:/usr/local/arm-gdb/bin
#arm-linux-gdb hello
(gdb) target remote 192.168.2.223:2345
(192.168.2.223為開發(fā)板IP)
出現(xiàn)提示:
Remote debugging using 192.168.2.223:2345
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同時(shí)在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
連接成功,這時(shí)候就可以輸入各種GDB命令如list、run、next、step、break等進(jìn)行程序調(diào)試了。
以上針對(duì)通過nfs mount和tftp的方式,只能在主機(jī)上調(diào)試好后下載到開發(fā)板上運(yùn)行,如果有錯(cuò)誤要反復(fù)這個(gè)過程,繁瑣不說,有些程序只能在開發(fā)板上調(diào)試,所以筆者采用了gdbserver的遠(yuǎn)程調(diào)試方式,希望對(duì)大家調(diào)試程序有用!
二、交叉調(diào)試舉例
============================
以上資料源于csdn,內(nèi)容比較全面但是也比較多,下面通過一個(gè)針對(duì)QtExtended開發(fā)環(huán)境下的,簡(jiǎn)單例子,對(duì)其過程進(jìn)行演示。其他開發(fā)環(huán)境過程也類似。
大致步驟如下:
1)qbuild.pro中添加如下:
CONFIG+=debug
這一步是Qtextended添加調(diào)試標(biāo)記用的,如果你的程序不是qtextended,那么使用"gcc -g"打開調(diào)試選項(xiàng)進(jìn)行編譯即可。
2)開發(fā)板子中:
#gdbserver :22222 myapp
3)開發(fā)主機(jī)中:
#arm-linux-gdb myapp
4)最后運(yùn)行如下即可開始調(diào)試:
(gdb)target remote 192.168.100.200:22222
這里192.168.100.200是開發(fā)板子ip。
三、其他
============================
本文主要參考:
http://blog.csdn.net/borefo/archive/2009/12/23/5060682.aspx
http://qtextended.org/doc/qtextended4.4/debug-qtextended.html
問題聯(lián)系:
作者:QuietHeart
Email:quiet_heart000@126.com
日期:2011年2月24日
|