就目前而言,嵌入式 Linux系統中,主要有三種遠程調試方法,分別適用於不同場合的調試工作:用ROM Monitor調試目標機程序、用KGDB調試系統內核和用gdbserver調試用戶空間程序。這三種調試方法的區別主要在於,目標機遠程調試stub 的存在形式的不同,而其設計思路和實現方法則是大致相同的。
而我們最常用的是調試應用程序。就是採用gdb+gdbserver的方式進行調試。在很多情況下,用戶需要對一個應用程序進行反覆調試,特別是複雜的程序。採用GDB方法調試,由於嵌入式系統資源有限性,一般不能直接在目標系統上進行調試,通常採用gdb+gdbserver的方式進行調試。Gdbserver在目標系統中運行,gdb則在宿主機上運行。
要進行GDB調試,目標系統必須包括gdbserver程序,宿主機也必須安裝gdb程序。一般linux發行版中都有一個可以運行的gdb,但開發人員不能直接使用該發行版中的gdb來做遠程調試,而要獲取gdb的源代碼包,針對arm平臺作一個簡單配置,重新編譯得到相應gdb。
下載gdb:如果放到了/home/cby目錄:
#cd /home/cby
#tar zxvf gdb-6.6.tar.gz
#cd gdb-6.6
#./configure --target=arm-linux --prefix=/home/cby/arm-gdb
#make
#make install
然後建立gdbserver:
#mkdir /home/cby/gdbserver
#cd ../gdbserver
#chmod +x /home/cby/gdb-6.6/gdb/gdbserver/configure
#CC=arm-linux-gcc ../gdb-6.6/gdb/gdbserver/configure /
--host=arm-linux --prefix=/home/cby/gdbserver
#make
#make install
#arm-linux-strip gdbserver
#cp gdbserver /tftpboot
二、調試步驟
1、交叉編譯,帶參數-gstabs 或 -g 加入調試信息。
假設要調試的程序爲hello.c。
#arm-linux-gcc -g hello.c -o hello
2、在Target Board開啓gdbserver
#gdbserver <host-ip>:2345 hello (我的host-ip是192.168.0.178)
gdbserver開始監聽2345端口(你也可以設其他的值),然後啓動hello,你會看到“Process test created:pid=88”
3、回到Host端
#export PATH=$PATH:/home/cby/arm-gdb/bin(arm-linux-gdb的路徑)
#arm-linux-gdb hello
最後一行顯示:This GDB was configured as “--host=i686-pc-linux-gnu,--target=arm-linux”...
說明此gdb在X86的Host上運行,但是調試目標是ARM代碼。
(gdb)target remote <target-board-ip>:2345 (我的target-board-ip is 192.168.0.177)
注意:你的端口號必須與gdbserver開啓的端口號一致,這樣才能進行通信。
建立鏈接後,就可以進行調試了。調試在Host端,跟gdb調試方法相同。注意的是要用“c”來執行命令,不能用“r”。因爲程序已經在Target Board上面由gdbserver啓動了。結果輸出是在Target Board端,用超級終端查看。