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
進入調試界面的效果:
直接運作程式
退出調試界面(quit 指令)
2.2 GDB 工具常用的指令
注意沒有輸入新指令,敲回車 GDB 會再次執行上一條指令;
檢視 gdb 使用幫助
設定程式斷點執行(breakpoints)
使用 breakpoints (可簡寫為 b)指令給程式添加斷點,共有下面幾種情況:
b <函數名> 在某函數入口處添加斷點;
b <行号> 在指定行添加斷點
b <檔案名:行号> 在指定檔案的指定行添加斷點
b <行号 if 條件> 當條件為真時,指定行号處斷點生效,例 b 5 if i=10 ,當 i=10 時,第 5 行斷點生效
檢視程式已經設定的斷點(info break)
添加完斷點之後,我們可以使用【info break】指令,檢視所有的斷點;
取消程式設定的斷點
每個斷點都有一個編号,可以用編号指定删除某個斷點:
有時候一個斷點暫時不用可以禁用掉而不必删除,這樣以後想用的時候可以直接啟用,而不必重新從代碼裡找應該在哪一行設斷點:
單步\連續支援程式
輸入 next 指令可實作單步運作 輸入 continue 指令可實作連續運作; 如果想檢視某一變量的值,則使用 print/p + 變量名;
gdb基本指令表
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 ,将其拷貝到目标闆中;
這裡gdbtest程式為例來說明,注意gdbtest程式需要用arm-linux-gcc編譯得到ARM版本的gdbtest程式,并下載下傳到目标闆上。
完成這些之後可以用file指令來檢查所準備gdb和gdbserver及gdbtest程式的格式是否正确;
四、調試
目标闆
# gdbserver 192.168.123.217:4545 ./gdbtest //主機IP
主機
# arm-linux-gdb ./gdbtest
五、可能出現的問題
錯誤一:安裝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