gdb和gdbserver工具的使用簡介與交叉編譯

一,介紹

     嵌入式系統資源有限性,一般不能直目標系統上進行調試,所以很多情況下都是遠程調試,就目前而言,嵌入式 Linux系統中,主要有三種遠程調試方法,分別適用於不同場合的調試工作:

    a,用ROM Monitor調試目標機程序;

    b,用KGDB調試系統內核;

    c,用gdbserver調試用戶空間程序。

     這三種調試方法的區別主要在於,目標機遠程調試stub 的存在形式的不同,而其設計思路和實現方法則是大致相同的。
     而我們最常用的是調試應用程序,就是採用gdb+gdbserver的方式進行調試。在很多情況下,用戶需要對一個應用程序進行反覆調試,特別是複雜的程序。採用GDB方法調試,gdbserver在目標系統中運行,gdb則在宿主機上運行。

二,編譯

2.1 跳過編譯

    不願意自己編譯的,可以直接官網下載(https://packages.debian.org/buster/gdb)編譯好的。我這裏是debian系統,所以用的是debian官網。

2.2 下載源碼

下載鏈接:http://ftp.gnu.org/gnu/gdb/

2.3 解壓

root@67f5f1812256:/data# tar -xvf gdb-9.1.tar.xz

2.4 編譯

root@67f5f1812256:/data/gdb-9.1# mkdir build
root@67f5f1812256:/data/gdb-9.1# cd build/
 ../configure CC=aarch64-linux-gnu-gcc -host=aarch64-linux-gnu -target=aarch64-linux-gnu 
root@67f5f1812256:/data/gdb-9.1/build# make

-target=aarch64-linux-gnu表示目標平臺,--host表示主機端運行的是aaarch64-linux-gnu,不需要配置--prefix,因爲gdbserver不在主機端安裝運行。

編譯後的gdb在

root@67f5f1812256:/data/gdb-9.1/build# ls gdb/gdb
gdb/gdb

需要make install 安裝一下,因爲下面要在宿主機用gdb客戶端。

編譯後的gdbserver在

root@67f5f1812256:/data/gdb-9.1/build# ls gdb/gdbserver/gdbserver
gdb/gdbserver/gdbserver

2.5 減小文件大小,使用strip

root@67f5f1812256:/data/gdb-9.1/build# file gdb/gdb
gdb/gdb: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=9022b80cc491a86587b79d27a8165348dfd88a0e, with debug_info, not stripped
root@67f5f1812256:/data/gdb-9.1/build# aarch64-linux-gnu-strip gdb/gdb -o test_gdb
root@67f5f1812256:/data/gdb-9.1/build# file test_gdb
test_gdb: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=9022b80cc491a86587b79d27a8165348dfd88a0e, stripped
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build# file gdb/gdbserver/gdbserver
gdb/gdbserver/gdbserver: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=e2b769f9292f95603b93f7deaf41adfe91f81804, with debug_info, not stripped
root@67f5f1812256:/data/gdb-9.1/build# aarch64-linux-gnu-strip gdb/gdbserver/gdbserver -o test_gdbserver
root@67f5f1812256:/data/gdb-9.1/build# file test_gdbserver
test_gdbserver: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=e2b769f9292f95603b93f7deaf41adfe91f81804, stripped
root@67f5f1812256:/data/gdb-9.1/build#

三,使用

3.1 目標板運行gdbserver

root@huawei:~# gdbserver 192.168.0.107:6666 test
Process /gyz/ecSmartFire created; pid = 169
Listening on port 6666

說明:
1,192.168.0.107是宿主機ip,即gdb運行的環境;
2,test爲帶調試-g選項的可執行程序。

等gdb也連接上後,多了一句,如下:
root@huawei:~# gdbserver 192.168.0.107:6666 test
Process /gyz/ecSmartFire created; pid = 169
Listening on port 6666
Remote debugging from host 192.168.1.107, port 58494

3.1 宿主機運行gdb

root@debian:/home/guoyanzhang/share/502H/502H/output# gdb test
...gdb提示信息
(gdb) gdb remote 192.168.1.200:6666
Remote debugging using 192.168.1.200:6666
說明:
1,192.168.1.200是目標板子的ip,即gdbserver運行的環境


四,strip簡單介紹

    strip命令用於脫掉文件的衣服, 文件會變小, 其中的符號信息會失去。 那這個strip有什麼用呢? 很有用的! 原來的a.out比較大, 可以執行。 在strip之後, 文件變小了, 也是可以執行, 這就節省了很多空間。其實, strip不僅僅可以針對可執行文件, 還能針對目標文件和動態庫等. 在實際的開發中, 經常需要對動態庫.so進行strip操作, 減少佔地空間。 而在調試的時候(比如用addr2line), 就需要符號了。 因此, 通常的做法是: strip前的庫用來調試, strip後的庫用來實際發佈, 他們兩者有對應關係。 一旦發佈的strip後的庫出了問題, 就可以找對應的未strip的庫來定位。例如某個動態庫strip前是50M左右, strip後是20M左右, 可見, 脫脫衣服還是有明顯好處的。我們在調試過程中, 經常涉及到上傳庫, 庫太大時, 很耗費傳輸時間, 所以還是先用strip來處理一下比較好。
 

五,參考

5.1 gdbserver工具移植及使用簡介

5.2 gdb和gdbserver的介紹與anzhuang

5.3 gdb和gdbserver的安裝和調試

5.4 linux中的strip命令簡介

5.5 交叉編譯arm gdb

5.6 linux下gdb-8.2編譯安裝

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章