1. 程式人生 > >交叉編譯gdb+gdbserver實現遠端除錯

交叉編譯gdb+gdbserver實現遠端除錯

 總結一下linux下交叉編譯gdb並遠端除錯程式的知識 

1.配置交叉編譯工具鏈到系統環境變數PATH下

export PATH=$PATH:'交叉編譯工具鏈的絕對路徑‘

2.編譯主機端執行的gdb,但是處理的程式碼是arm平臺

./configure --target=arm-linux --host=i686-pc-linux-gnu --prefix=/home/arm-software-install/arm-gdb
(說明:交叉編譯時,我理解的target,host後面引數是你的交叉編譯工具鏈的字首)
make
make install

3.交叉編譯arm開發板執行的gdbserver

./configure --target=arm-linux --host=arm-linux --prefix=/home/arm-software-install/arm-gdbserver
make
make install

注意:可能第二步編譯gdb時會出現錯誤,提示configure: error: no termcap library found。
顯然系統缺少termcap庫,這是一個終端資料庫。因此要交叉編譯編譯termcap庫並將編譯出來的標頭檔案termcap.h和庫檔案libtermcap.a分別放到交叉編譯工具鏈預設搜尋的include和lib目錄下。可以在交叉編譯工具鏈的目錄下執行XXXXXXX-linux-gcc -print-file-name libc.a命令檢視預設搜尋路徑。
交叉編譯編譯termcap時,執行完./configure --target=arm-linux --host=arm-linux --prefix=/home/arm-software-install/arm-termgap命令後,配置完成後可能termgap並不是交叉編譯,這裡也不知道是什麼原因。這時候就需要手動修改生成的makefile檔案,將CC和AR分別改成交叉編譯工具鏈的相應工具名稱,然後執行make,make install即可。如果再編譯gdb時還是提示沒有找到termgap庫,可以檢查以下系統是否安裝了ncurses

庫,可以通過apt-get安裝。編譯完成後可以通過file命令檢視編譯出的檔案是執行在那種平臺上的程式。

編譯完成後可以利用gdb+gdbserver進行遠端除錯(注意:一定要用自己編譯出來的gdb和gdbserver除錯否則會因為版本不匹配造成除錯失敗)。

生成的gdb在host端執行,而gdbserver需要下載到板子上執行。這兩者之間可以利用TCP(格式為host:port)、UDP(格式為udp:host:port)或者串列埠(比如/dev/ttyb)來通訊。使用gdbserver除錯方式時,在目標機端需要一份要除錯的程式的拷貝,這通常是通過ftp或NFS下載到目標機上的,宿主機端也需要這信一份拷貝。由於gdbserver不處理程式符號表,所以如果有必要,可以用strip工具將要複製到目標機上的程式中的符號表去掉以節省空間。符號表是由執行在主機端的GDB偵錯程式處理的,不能將主機端的程式中的符號表去掉。

利用網路遠端除錯步驟:
1.板子上需要執行的命令
gdbserver 192.168.1.200(宿主機的ip地址):7777(伺服器端需要監聽的埠號,自行指定)   test(要除錯的程式)
2.主機上需要執行的命令
arm-linux-gdb test
target remote 192.168.1.168(開發板的ip地址):7777                  --連線gdbserver,連線成功後會在板子的控制檯上顯示出相應的提示
接下來在host終端上輸入除錯命令就像除錯本地程式一樣。