總體介紹
遠端除錯環境由宿主機gdb和目標機除錯stub共同構成,兩者通過串列埠或tcp連線。使用 gdb標準程序列協議協同工作,實現對目標機上的系統核心和上層應用的監控和除錯功能。除錯stub是嵌入式系統中的一段**,作為宿主機gdb和目標機除錯程式間的乙個媒介而存在。
就目前而言,嵌入式linux系統中,主要有三種遠端除錯方法,分別適用於不同場合的除錯工作:用rommonitor除錯目標機程式、用kgdb除錯系統核心和用gdbserver除錯使用者空間程式。這三種除錯方法的區別主要在於,目標機遠端除錯stub的存在形式的不同,而其設計思路和實現方法則是大致相同的。
而我們最常用的是除錯應用程式。就是採用gdb+gdbserver的方式進行除錯。在很多情況下,使用者需要對乙個應用程式進行反覆除錯,特別是複雜的程式。採用gdb方法除錯,由於嵌入式系統資源有限性,一般不能直接在目標系統上進行除錯,通常採用gdb+gdbserver的方式進行除錯。
2. 解壓到/opt目錄下
#cd /opt
#tar xzvf /tmp/gdb-6.8.tar.gz
3. 建立配置檔案、編譯
gdb允許把編譯配置和編譯結果放到任意的目錄,因此可以在gdb目錄之外建立乙個專門存放編譯結果目錄.
#cd /opt
#mkdir -p arm-gdb/build
#cd arm-gdb/build
#/opt/gdb-6.8/configure --target=arm-linux--prefix=/opt/arm-gdb
#make
#make install
(--target配置gdb的目標平台,--prefixp指定了編譯結果的存放位置,也就是安裝目錄。編譯完後可以在/opt/arm-gdb/bin目錄下找到可執行的arm-linux-gdb, arm-linux -gdbtui, arm-linux-run。 拷貝arm-linux-gdb到/usr/bin目錄
#cd /opt/arm-gdb/bin/
#cp arm-linux-gdb /usr/bin/
4. gdbserver的移植
gdbserver要用到gdb原始碼目錄下的一些標頭檔案,因此無法在gdb原始碼目錄之外編譯檔案。
進入gdb/gdbserver目錄:
[root@dding gdbserver]# pwd
/opt/gdb-6.8/gdb/gdbserver
[root@dding gdbserver]#必須在gdbserver目錄下執行配置命令,此時才能用相對路徑
#./configure --target=arm-linux--host=arm-linux
(--target=arm-linux表示目標平台,--host表示主機端執行的是arm-linux-gdb,不需要配置—prefix,因為gdbserver不在主機端安裝執行)
#makecc=/usr/bin/arm/4.3.2/bin/arm-linux-gcc
(這一步要指定你自己的arm-linux-gcc的絕對位置,我試過相對的不行,提示make: arm-linux-gcc:command notfound,可好多人都用的相對路徑,即直接賦值arm-linux-gcc,可採取make時傳遞引數,也可以直接修改gdbserver目錄下的makefile檔案中的環境變數cc)
沒有錯誤的話就在gdbserver目錄下生成
gdbserver可執行檔案,注意此時要更改其屬性,否則可能會出現無法訪問的情況,
chmod 777gdbserver將其更改為任何人都可以讀寫執行;使用arm-linux-strip命令處理一下gdbserver,將多餘的符號資訊刪除,可讓elf檔案更精簡,通常在應用程式的最後發布時使用;然後把它燒寫到flash的根檔案系統分割槽的/usr/bin(在此目錄下,系統可以自動找到應用程式,否則必須到gdbserver所在目錄下執行之),或通過nfsmount的方式都可以。只要保證gdbserver能在開發板上執行就行。
二、gdb+gdbserver nfs除錯流程
下面就可以用gdb+gdbserver除錯我們開發板上的程式了。在目標板上執行gdbserver,其實就是在宿主機的minicom下。連線主機和開發板.我選擇了串列埠線和網線連線起了主機和開發板
連線好電源,串列埠線,網線,開啟串列埠終端.
通過nfs啟動系統後,在開發板終端輸入 #
mount -t nfs-oonolock192.168.50.72:/opt/friendlyarm/mini2440/root_qtopia
/mnt/
hello程式放在root_qtopia
下面.hello為要除錯的程式(必須-g加入除錯資訊)。
# arm-linux-gcc -g-o hello hello.c
要進行gdb除錯,首先要在目標系統上啟動gdbserver服務。在gdbserver所在目錄下輸入命令:
#cd /mnt/
#gdbserver192.168.50.72:2345 hello
192.168.50.72為宿主機ip,在目標系統的2345埠(你也可以設其他可用的值,當然必須跟主機的gdb一致)開啟了乙個除錯程序,hello為要除錯的程式(必須-g加入除錯資訊)。
process/mnt/hello created: pid=80
listening on port2345
(另乙個終端下)
#cd /opt/friendlyarm/mini2440/root_qtopia
#arm-linux-gdbhello
最後一行顯示:this gdb wasconfigured as 「--host=i686-pc-linux-gnu,--target=arm-linux」...,如果不一致說明arm-linux-gdb有問題
說明此gdb在x86的host上執行,但是除錯目標是arm**。
(gdb) target remote192.168.50.168:2345
(192.168.50.168為開發板ip)
remotedebugging using 192.168.50.168:2345
[new thread 80]
[switching to thread80]
0x40002a90 in??()
remote debugging from host192.168.50.72
(gdb)
注意:你的埠號必須與gdbserver開啟的埠號一致,這樣才能進行通訊。建立鏈結後,就可以進行除錯了。除錯在host端,跟gdb除錯方法相同。注意的是要用「c」來執行命令,不能用「r」。因為程式已經在targetboard上面由gdbserver啟動了。結果輸出是在targetboard端,用超級終端檢視。連線成功,這時候就可以輸入各種gdb命令如list、run、next、step、break等進行程式除錯了。
建立連線後進行gdb遠端除錯和gdb本地除錯方法相同
gdb gdbserver除錯 方式1
目錄 一 gdb gdbserver總體介紹.1 四 gdb gdbserver nfs除錯流程.2 五 如何利用串列埠除錯.3 六 實戰除錯.3 七 linux下安裝gdbserver問題.5 root at91rm9200dk arm cp libthread db 1.0.so libthre...
嵌入式gdb gdbserver除錯
在很多情況下,需要對應用程式進行除錯。在 linux 下除錯程式,常用的工具是 gdb。由於嵌入式單板的資源有限,一般不直接在目標機上執行 gdb 進行除錯,而是採取 gdb gdbserver 的方式。gdbserver 在目標機中執行,gdb 則在宿主機上執行。根檔案系 統中已經包含 gdbse...
搭建gdb gdbserver遠端除錯環境
2,linux系統自帶gdb工具,可是無法用在arm除錯中,需要單獨編譯arm linux gdb。tar zxvf gdb 9.1.tar.gz cd gdb 9.1 生產makefile configure prefix pwd install target 指定目標平台,prefix 指定安裝...