俗話說:工欲善其事,先必利其器。
在對嵌入式進行調試之前,必須要產生調試器。經典地,Linux平台下的調試器為gdb。
本文僅講述如何產生調試器,不涉及其中的論理——要找理論,找老師或者課本。
1、下載gdb:
為:
http://ftp.gnu.org/gnu/gdb/
按照一般的想法,最新版本越好,因此下載7.2這個版本。當然,凡事無絕對。
我們以gdb-7.2.tar.bz2 這個檔案為例。
2、解壓縮:
$ tar jxvf gdb-7.2.tar.bz2
註:小技巧:Linux下一般壓縮檔尾碼為.tar.bz2和.tar.gz,它們解壓命令有兩三個選項是一致的:
xf(v),前者再加上j選項,後者再加上z選項。
3、進入該目錄
$ cd gdb-7.2/
4、配置
$./configure --target=arm-linux --program-prefix=arm-linux- --prefix=/usr/local/arm-gdb
注:--target=arm-linux意思是說目標平台是運行於ARM體繫結構的linux核心;--program-prefix=arm-linux-是指產生的可執行檔的首碼,比如arm-linux-gdb,--prefix是指產生的可執行檔安裝在哪個目錄,這個目錄需要根據實際情況作選擇。如果該目錄不存在,會自動建立,當然,許可權足夠的話。
5、編譯、安裝
$ make
$ make install
幸運的話,會在--prefix指定的目錄下產生三個子目錄:bin、lib、share,我們需要的arm-linux-gdb就在其中的bin目錄下。
如果你不小心查看它的大小的話,會發覺它有14MB那麼大!天呐!怎麼會佔這麼多空間?沒關係,我們可以為它瘦身。沒錯!就是使用strip命令!
$ strip arm-linux-gdb -o arm-linux-gdb-stripped
$ ls -lh
總計 33M
-rwxr-xr-x 1 latelee root 14M 12-14 16:16 arm-linux-gdb
-rwxr-xr-x 1 latelee root 3.1M 12-14 16:25 arm-linux-gdb-stripped
可以看到,strip後的檔案大小只有3.1MB,瘦身效果明顯!如果做廣告的話,絕對有說服力。
這個檔案就是我們以後遠端偵錯時在主機上啟動並執行交叉調試器了:在主機上執行,調試的卻是另一種體繫結構的代碼。但是,光有主機的調試器還不夠。還需要在目標板上運行一個叫gdbserver的東東。這個東東是怎麼來的呢?
1、在剛才那個gdb解壓後的目錄:gdb-7.2,進入./gdb/gdbserver子目錄
$ cd gdb/gdbserver
$ pwd
/home/gotohell/soft/gdb-7.2/gdb/gdbserver
2、配置
$ ./configure --target=arm-linux --host=arm-linux
這裡的--host指定了產生可執行檔啟動並執行平台和系統:運行於ARM平台的Linux系統
3、編譯
$ make
一切如果沒有問題的話,會在目前的目錄下產生gdbserver這個只有在ARM下啟動並執行檔案。
註:網上絕大部分資料顯示,這裡的make會出錯,說某個標頭檔不存在。經本人親自挂帥出征,在gdb的7.2版本不存在那個問題。低於7.2版本的就要注意了。解決方案也簡單,在配置後(執行./configure後),將產生的config.h檔案中
#define HAVE_SYS_REG_H 1
語句注釋掉即可。
另外,也有資料說編譯gdbserver需要指定交叉編譯器(即執行make CC=arm-linux-gcc),但此處直接make,也沒問題。當然,交叉編譯器需要安裝好並設定好環境變數。我們看一下這個是什麼傢伙:
$ file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.14, not stripped
32位,ARM平台,動態連結,未strip。
同樣,我們也減小它的體積:
$ arm-linux-strip gdbserver -o gdbserver-stripped
$ ls -lh | grep gdbserver
-rwxr-xr-x 1 latelee root 534K 12-14 15:50 gdbserver
-rwxr-xr-x 1 latelee root 173K 12-14 16:36 gdbserver-stripped
瘦身效果同樣那麼明顯!
注意,這裡必須使用strip的交叉版本,也就是arm-linux-strip。
到此,我們產生了兩個重量層級的檔案:arm-linux-gdb和gdbserver。它們的版本是一致的,這一點非常重要。我們需要將gdbserver下載到開發板中,——可以通過各種各樣的手段,包括但不限於NFS。調試時需要在開發板中運行這個程式。同時在主機中執行arm-linux-gdb調試器。
(HTML文法著色工具由遲思堂工作室李遲提供,“latelee”為系統保留詞,以紅色加粗字型出現,特此說明)
至於調試的技術及調試的步驟,不在本文範圍內。在後續文章中,應該也許大概可能會有相關內容的出現。大家就不用等待了。