天天看點

安裝GDB和GDBSERVER

安裝GDB和GDBSERVER

把GDBSERVER裝入檔案系統

在mini2440上使用GDB遠端調試 

哈哈,一直都沒有發過有建設性的文章,今次發個《在mini2440上使用GDB遠端調試》,下面的東西雖算不上絕對原創, 

但是經過我試驗和總結的,用NFS作根檔案系統配合GDB為我們的開發和學習提供了很大的便利,希望大家會喜歡!

 arm-linux-gdb 移植——PC端

2. 解壓到/opt目錄下 

#cd /opt 

#tar xzvf /tmp/gdb-6.6.tar.gz 

3. 建立配置檔案、編譯 

gdb允許把編譯配置和編譯結果放到任意的目錄,是以可以在gdb目錄之外建立一個專門存放編譯結果的目錄。 

#mkdir -p arm-gdb/build 

#cd arm-gdb/build 

#/opt/gdb-6.6/configure --target=arm-linux --prefix=/opt/arm-gdb 

#make 

#make install 

prefix指定了編譯結果的存放位置,也就是安裝目錄。 

如果在編譯arm-linux-low.c這個檔案時提示找不到“sys/reg.h”,則修改arm-linux-low.c,注釋掉#include "sys/reg.h"。 

編譯完後可以在/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/

錯誤:

我使用的GCC版本是4.3.3,在編譯過程中報錯:

/bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I.././opcodes -I. -D_GNU_SOURCE -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I.././opcodes/../intl -I../intl   -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -g -O2 -c -o arm-dis.lo arm-dis.c

gcc -DHAVE_CONFIG_H -I. -I.././opcodes -I. -D_GNU_SOURCE -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I.././opcodes/../intl -I../intl -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -g -O2 -c arm-dis.c -o arm-dis.o

cc1: warnings being treated as errors

arm-dis.c: In function 'print_insn_thumb16':

arm-dis.c:2950: error: format not a string literal and no format arguments

arm-dis.c:2957: error: format not a string literal and no format arguments

arm-dis.c: In function 'print_insn_thumb32':

arm-dis.c:3491: error: format not a string literal and no format arguments

arm-dis.c:3499: error: format not a string literal and no format arguments

make[4]: *** [arm-dis.lo] Error 1

make[4]: Leaving directory `/opt/gdb-6.5/opcodes'

make[3]: *** [all-recursive] Error 1

make[3]: Leaving directory `/opt/gdb-6.5/opcodes'

make[2]: *** [all] Error 2

make[2]: Leaving directory `/opt/gdb-6.5/opcodes'

make[1]: *** [all-opcodes] Error 2

make[1]: Leaving directory `/opt/gdb-6.5'

make: *** [all] Error 2

這是源碼中有些函數定義不規範,用對函數格式非常嚴格的GCC 4.3編譯就會出錯,而GCC 4.1 不會報錯。

自然不樂意重新安裝GCC退回到4.1的版本來解決這個問題,我是這樣做的。

$cd /opt/gdb-6.5/opcodes

進入編譯出錯的目錄;

$/bin/sh ./libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I.././opcodes -I. -D_GNU_SOURCE -I. -I.././opcodes -I../bfd -I.././opcodes/../include -I.././opcodes/../bfd -I.././opcodes/../intl -I../intl   -W -Wall -Wstrict-prototypes -Wmissing-prototypes -g -O2 -c -o arm-dis.lo arm-dis.c

将編譯的指令拷貝,去掉“-Werror”,重新編譯,隻有警告資訊,沒有報錯誤。

$cd ..

推出子目錄

$make

繼續make

4,make install

 gdbserver的移植——開發闆端 

gdbserver要用到gdb源碼目錄下的一些頭檔案,是以無法在gdb源碼目錄之外編譯檔案。 

#cd /opt/gdb-6.6/gdb/gdbserver 

#./configure --host=arm-linux --target=arm-linux --prefix=/opt/arm-gdb/gdbserver 

注意:此處target參數和host參數都要設定為arm-linux,因為gdbserver是放在目标闆上運作的。 

編譯後,可以在/opt/arm-gdb/gdbserver/bin目錄下找到arm-linux-gdbserver,下載下傳該檔案到目标闆的/usr/bin目錄并重命名為gdbserver。 

同時要下載下傳gdbserver需要的庫檔案libthread_db-x.x.so(在交叉編譯器的安裝目錄的lib子目錄下可以找到)到目錄闆的/usr/lib目錄, 

再建立兩個符号連結libthread_db.so和libthread_db.so.1。 

在目标闆上執行 

#cd \usr\lib 

#ln –s libthread_db-x.x.so libthread_db.so 

#ln –s libthread_db-x.x.so libthread_db.so.1 

5. 使用gdbserver 

在目标闆上運作gdbserver 

#./gdbserver 192.168.0.2:2345 hello 

其中192.168.0.2為目标闆的IP。2345為gdbserver打開的端口,可以自己設定。 

6. 運作gdb用戶端 

#./arm-linux-gdb hello 

(gdb)target remote 192.168.0.2:2345 

(gdb) list 

1 #include <stdio.h> 

2 #include <fcntl.h> 

4 int main() 

5 { 

6 printf("hello world \n"); 

7 return 0; 

8 } 

(gdb)b main 

(gdb)c 

7. GDB的基本指令: 

load:裝入一個程式 

symbol-file:裝入符号庫檔案,可以是用-g參數編譯的可執行檔案。 

f(ile):指定一個可執行檔案進行調試,gdb将讀取些檔案的調試訊息,如f a.exe 

l(ist):列程式出源檔案 

r(un) :裝載完要調試的可執行檔案後,可以用run指令運作可執行檔案 

b(reak):設定斷點(break point),如b 25,則在源程式的第25行設定一個斷點,當程式執行到第25行時,就會産生中斷;也可以使用b funcname,funcname為函數的名稱, 

當程式調用些函數時,則産生中斷 

c(ontinue):c指令可以另中斷的程式繼續執行,直到下一個中斷點或程式結束 

p(rint):輸入某個變量的值,如程式定義了一個int aa的就是,p aa就會輸出aa的目前值 

n(ext):程式執行到斷點時中斷執行,可以用n指令進行單步執行 

s(tep):程式執行到斷點時中斷執行,可以用s指令進行單步執行進某一函數 

q(uit):退出GDB

我的gdbserver位于/sbin下,調試時要進入應用程式目錄下;arm-linux-gdb位于/usr/bin/下。

調試步驟:

1、gdbserver 172.16.17.50:2345 XXX     開發闆端

2、/usr/bin/arm-linux-gdb XXX PC端

3 、 target remote 172.16.17.50:2345 PC端

繼續閱讀