天天看點

gdb調試和gdbserver遠端調試

Linux下GDB調試工具使用

一、gcc編譯器的常用選項

  使用 GCC 編譯器的時候,我們必須給出一系列必要的調用參數和檔案名稱。GCC 編譯器的調用參數大約有100 多個,這裡隻介紹其中最基本、最常用的參數。

GCC 最基本的用法∶ gcc [參數] [檔案名稱]

常用的參數如下

-c 隻編譯:不連結成為可執行檔案,編譯器隻是由輸入的.c 等源代碼檔案生成.o 為字尾的目标檔案,通常 用于編譯不包含主程式的子程式檔案。

-o output_filename:确定輸出檔案的名稱為 output_filename,同時這個名稱不能和源檔案同名。如果不給出 這個選項,gcc 就給出預設的可執行檔案 a.out。

-g:産生符号調試工具(GNU  的 gdb)所必要的符号資訊,要想對源代碼進行調試,我們就必須加入這個選項。

-O:對程式進行優化編譯、連結,采用這個選項,整個源代碼會在編譯、連結過程中進行優化處理,這樣産 生的可執行檔案的執行效率可以提高,但是,編譯、連結的速度就相應地要慢一些。

-O2:比-O 更好的優化編譯、連結,當然整個編譯、連結過程會更慢。

-E:僅執行編譯預處理;

-S:将 C 代碼轉換為彙編代碼;

示例:

#gcc test.c -o app
           

編譯時指定庫與頭檔案路徑

-L:指定動态庫路徑。示例:gcc test.c -o app -L/usr/lib

-I: 指定頭檔案存放的路徑。示例:gcc test.c -o app -I/usr/include

-l: 指定庫名稱。示例:示例:gcc test.c -o app –lpthread

二、GDB調試工具

  我們通常寫 C 程式,會使用指令 gcc test.c -o test,對源檔案進行編譯,但是如果我們要對程式進行調試,就 必須在編譯源檔案時,使用-g 參數,編譯時使用的指令為:gcc -g test.c -o app

GDB 工具也支援自動補全,比如:    list 指令可以簡寫 l    ,run 指令可以簡寫 r

2.1 GDB工具基本使用

編譯支援GDB調試程式:

#gcc -g test.c -o app
           

啟用GDB調試

#gdb app
           

進入調試界面的效果:

gdb調試和gdbserver遠端調試

直接運作程式

gdb調試和gdbserver遠端調試

退出調試界面(quit 指令)

gdb調試和gdbserver遠端調試

2.2 GDB 工具常用的指令

注意沒有輸入新指令,敲回車 GDB 會再次執行上一條指令;

檢視 gdb 使用幫助

gdb調試和gdbserver遠端調試

設定程式斷點執行(breakpoints)

使用 breakpoints (可簡寫為 b)指令給程式添加斷點,共有下面幾種情況:

b <函數名> 在某函數入口處添加斷點;

b <行号> 在指定行添加斷點

b <檔案名:行号> 在指定檔案的指定行添加斷點

b <行号 if 條件>  當條件為真時,指定行号處斷點生效,例 b 5 if i=10 ,當 i=10 時,第 5 行斷點生效

gdb調試和gdbserver遠端調試

檢視程式已經設定的斷點(info break)

添加完斷點之後,我們可以使用【info break】指令,檢視所有的斷點;

gdb調試和gdbserver遠端調試

取消程式設定的斷點

每個斷點都有一個編号,可以用編号指定删除某個斷點:

gdb調試和gdbserver遠端調試

有時候一個斷點暫時不用可以禁用掉而不必删除,這樣以後想用的時候可以直接啟用,而不必重新從代碼裡找應該在哪一行設斷點:

gdb調試和gdbserver遠端調試
gdb調試和gdbserver遠端調試

單步\連續支援程式

輸入 next 指令可實作單步運作 輸入 continue 指令可實作連續運作; 如果想檢視某一變量的值,則使用 print/p + 變量名;

gdb調試和gdbserver遠端調試
gdb調試和gdbserver遠端調試

gdb基本指令表

gdb調試和gdbserver遠端調試
gdb調試和gdbserver遠端調試
gdb調試和gdbserver遠端調試
gdb調試和gdbserver遠端調試

Linux下GDB遠端調試工具使用

  有些時候由于模拟環境的限制,調試必須要在目标闆上進行。由于嵌入式系統資源比較有限,一般不能在目标闆上直接建構GDB的調試環境,這時通常采用gdb+gdbserver的遠端調試方法:gdbserver在目标闆中運作,而gdb則在主機上運作。

建構gdb+gdbserver調試環境的在于,要将gdb和gdbserver都編譯成适用于目标闆的版本。比如我們用x86的主機和ARM目标闆,平時在主機上直接調試的時候都使用用于x86調試的gdb,但這個gdb不能用于遠端調試中,需要針對ARM平台進行配置之後重新編譯才行;而gdbserver要運作在目标闆上,則需要用arm-linux-gcc編譯才行。

一、源碼下載下傳

  下載下傳位址為:http://ftp.gnu.org/gnu/gdb/;

二、編譯arm-linux-gcc

  Linux系統本身已經自帶gdb工具,但無法用在嵌入式調試中,需要單獨編譯arm-linux-gdb。

1. 解壓源碼包

tar -zxvf gdb-6.6a.tar.gz
cd gdb-6.6/
           

2. 生成Makefile檔案

./configure --target=arm-linux  或--prefix=$PWD/__install
           

–target:指定目标平台。

這時我們編譯的是用于主機上的gdb程式,是以仍然用x86版本的gcc編譯,而不是用arm-gcc。

3. 編譯安裝

make && make install
           

三、編譯gdbserver

1. 生成Makefile

  編譯的gdbserver程式則是運作在目标闆上的,需要用arm-gcc來編譯了,用CC=<your_arm-linux-gcc_path>來指定arm-linux-gcc編譯器;

cd gdb/gdbserver/
./configure --target=arm-linux --host=arm-linux
make CC=/mywork/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc
make install
           

/home/zdw/gdb/build_env_mini/build/usr/bin

完成之後會在目前目錄下生成可執行程式gdbserver ,将其拷貝到目标闆中;

gdb調試和gdbserver遠端調試

  這裡gdbtest程式為例來說明,注意gdbtest程式需要用arm-linux-gcc編譯得到ARM版本的gdbtest程式,并下載下傳到目标闆上。

完成這些之後可以用file指令來檢查所準備gdb和gdbserver及gdbtest程式的格式是否正确;

gdb調試和gdbserver遠端調試

四、調試

目标闆

# gdbserver 192.168.123.217:4545 ./gdbtest  //主機IP
           

主機

# arm-linux-gdb ./gdbtest
           
gdb調試和gdbserver遠端調試

五、可能出現的問題

錯誤一:安裝C++

解決方法:

sudo apt-get install build-essential
           

錯誤二:

make[5]: *** [gdb.info] 錯誤 127

make[5]:正在離開目錄 `/home/fh/下載下傳/gdb-7.12/gdb/doc'

make[4]: *** [subdir_do] 錯誤 1

make[4]:正在離開目錄 `/home/fh/下載下傳/gdb-7.12/gdb'

make[3]: *** [install-only] 錯誤 2

make[3]:正在離開目錄 `/home/fh/下載下傳/gdb-7.12/gdb'

make[2]: *** [install] 錯誤 2

make[2]:正在離開目錄 `/home/fh/下載下傳/gdb-7.12/gdb'

make[1]: *** [install-gdb] 錯誤 2

make[1]:正在離開目錄 `/home/fh/下載下傳/gdb-7.12'

make: *** [install] 錯誤 2

解決方法:

sudo apt-get install texinfo
           

繼續閱讀