gdb 使用

1、GDB多線程調試的基本命令:

info threads:顯示當前可調試的所有線程,每個線程會有一個GDB爲其分配的ID,後面操作線程的時候會用到這個ID。 前面有*的是當前調試的線程。

thread ID:切換當前調試的線程爲指定ID的線程。

break thread_test.c:123 thread all: 在所有線程中相應的行上設置斷點

thread apply ID1 ID2 command: 讓一個或者多個線程執行GDB命令command。 

thread apply all command: 讓所有被調試線程執行GDB命令command。

set scheduler-locking off|on|step :在使用step或者continue命令調試當前被調試線程的時候,其他線程也是同時執行的。off 不鎖定任何線程,也就是所有線程都執行,這是默認值。 on 只有當前被調試程序會執行。 step 在單步的時候,除了next過一個函數的情況以外,只有當前線程會執行。

(minicom下)
#cd /tmp
#./gdbserver 192.168.2.100:2345 hello
192.168.2.100爲宿主機IP,在目標系統的2345端口開啓了一個調試進程,hello爲要調試的程序。
出現提示:
Process /tmp/hello created: pid="80"
Listening on port 2345
(另一個終端下)
#cd /
#export PATH=$PATH:/usr/local/arm-gdb/bin
#arm-linux-gdb hello
(gdb) target remote 192.168.2.223:2345
(192.168.2.223爲開發板IP)
出現提示:
Remote debugging using 192.168.2.223:2345
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同時在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
連接成功,這時候就可以輸入各種gdb命令如list、run、next、step、break等進行程序調試了。

遠程調試環境由宿主機gdb和目標機調試stub共同構成,兩者通過串口或TCP連接。使用GDB標準程串行協議協同工作,實現對目標機上的系統內核和上層應用的監控和調試功能。調試stub是嵌入式系統中的一段代碼,作爲宿主機GDB和目標機調試程序間的一個媒介而存在。

2、源程序編譯:

download  from  http://cygwin.mirrors.pair.com/gdb/old-releases/

$ tar jxf gdb-5.2.1.tar.bz2

$ cd gdb-5.2.1

$ mkdir obj

$ cd obj

../configure --target=armv4l-unknown-linux /

        --enable-shared --prefix=/tmp/g /

        --without-x --disable-gdbtk --disable-tui /

        --without-included-regex --without-included-gettext

$ make

$ make install

$ mkdir gdb/gdbserver 

$ cd gdb/gdbserver

$ chmod +x ../../../gdb/gdbserver/configure

$ CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc /

        ../../../gdb/gdbserver/configure armv4l-unknown-linux /

        --without-included-regex --without-included-gettext

$ make

$ cp -vf gdbreplay gdbserver /tmp/g/bin

3、多線程調試:

如果要調試的程序有線程的話,則需手動運行程序後,用下面的命令調試相應的線程

gdbserver 59.69.74.87:2345 --attach 21119

其中 21119是線程進程號

4、動態庫調試:

gdb) b main //在程序入口處設個斷點

Breakpoint 1 at 0xb2e8: file main.cpp, line 24.

(gdb) c

Continuing.

(gdb) directory ../datamanage   //加入動態庫源碼目錄,不然gdb無法找到源文件

Source directories searched: /home/yifei/Src/taskmanage/../datamanage:/home/yifei/WFET20d

(gdb) sharedlibrary     //將共享庫加入

Reading symbols from /home/et1000/lib/libbase.so...done.

(gdb) br TaskDb.cpp:35  //在動態庫源程序中設斷點

Breakpoint 2 at 0x400b60c0: file TaskDb.cpp, line 35.

 注意:1、主機上動態庫的路徑必須與目標機的路徑一樣

              2、主機上動態庫的目錄需有執行權

5、gdb 的常用命令:

  bt 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。

  clear 刪除設置在特定源文件、特定行上的斷點。其用法爲clear FILENAME:NUM

  continue 繼續執行正在調試的程序。該命令用在程序由於處理信號或斷點而 導致停止運行時。

  display EXPR 每次程序停止後顯示錶達式的值。表達式由程序定義的變量組成。

  file FILE 裝載指定的可執行文件進行調試。

  help NAME 顯示指定命令的幫助信息。

  info break 顯示當前斷點清單,包括到達斷點處的次數等。

  info files 顯示被調試文件的詳細信息。

  info func 顯示所有的函數名稱。

  info local 顯示當函數中的局部變量信息。

  info prog 顯示被調試程序的執行狀態。

  info var 顯示所有的全局和靜態變量名稱。

  kill 終止正被調試的程序。

  make 在不退出 gdb 的情況下運行 make 工具。

     print EXPR 顯示錶達式 EXPR 的值。

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