之前說過斷點調試,但是針對的是單文件的斷點調試。在實際應用中,一個項目是多目錄多文件的
參考資料:gdb debugger
目錄結構:
$ tree
.
├── gdbSomeFiles.cpp
├── Libs
│ ├── add.cpp
│ ├── add.h
│ └── makefile
└── makefile
add.h

1 #pragma once 2 3 class CAdd 4 { 5 public: 6 CAdd(void); 7 int add(int &a, int &b); 8 virtual ~CAdd(void); 9 };
add.cpp

1 #include "add.h" 2 3 CAdd::CAdd(void) 4 { 5 } 6 7 int CAdd::add(int &a, int &b) 8 { 9 int ret = a + b; 10 return ret; 11 } 12 13 CAdd::~CAdd(void) 14 { 15 }
上層makefile

1 CFLAGS=-g -Wall -pedantic -std=c++0x 2 xmain:$(OBJS) 3 # g++ ${CFLAGS} -c -I. add.cpp 4 # ar rc libadd.a add.o 5 # g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L./Libs -ladd 6 g++ $(CFLAGS) gdbSomeFiles.cpp -o xmain -I./Libs -L. -ladd 7 clean: 8 rm -f xmain $(OBJS) *.o *.a *~
Libs里面的makefile

1 #OBJS=gdbSomeFiles.o 2 CFLAGS=-g -Wall -pedantic -std=c++0x 3 main: 4 g++ ${CFLAGS} -c -I. add.cpp 5 ar rc libadd.a add.o 6 mv libadd.a ../ 7 clean: 8 rm -f xmain $(OBJS) *.o *.a *~
調試:
1.圖形化調試
$ gdb xmain --tui
2. 普通調試
$ gdb xmain
設置和獲取源代碼顯示數量:
默認情況下,GDB顯示指定位置處以及其前后的10行代碼,但是這是一個可設置的值。
set listsize count:設置list命令顯示的源代碼數量最多為count行,0表示不限制行數。
show listsize:顯示listsize的值。
(gdb) list add.cpp:9
如果顯示找不到第九行,則說明當前調試環境沒有add.cpp的源碼位置,添加add.cpp所在的目錄位置即可。
查看當前環境設置的調試目錄:(gdb) show directories
(gdb) directory ./Libs/
或者 (gdb) dir ./Libs/
如果該程序是由很多原文件構成的,你可以在各個原文件中設置斷點,而不是在當前的原文件中設置斷點,其方法如下:
(gdb) break filename:line-number
(gdb) break filename:function-name
在add.cpp的第九行打斷點
(gdb) break add.cpp:9
Breakpoint 1 at 0x40180e: file add.cpp, line 9.
(gdb) break line-or-function if expr
condition bnum: 取消第bnum個breakpoint的條件
break +offset: 在程序當前停止的行向前offset行處設置breakpoint
break –offset: 在程序當前停止的行向衙offset行處設置breakpoint
rbreak regex: 在所有符合正則表達式regex的函數處設置breakpoint
顯示當前gdb的斷點信息:
(gdb) info break
刪除指定的某個斷點:
(gdb) delete breakpoint 1
該命令將會刪除編號為1的斷點,如果不帶編號參數,將刪除所有的斷點
(gdb) delete breakpoint
3.禁止使用某個斷點
(gdb) disable breakpoint 1
該命令將禁止斷點 1,同時斷點信息的 (Enb)域將變為 n
4.允許使用某個斷點
(gdb) enable breakpoint 1
該命令將允許斷點 1,同時斷點信息的 (Enb)域將變為 y
5.清除原文件中某一代碼行上的所有斷點
(gdb)clean number
注:number 為原文件的某個代碼行的行號
在斷點處用display輸出a和b的值,以后再斷點處會顯示變量的值。undisplay取消顯示
(gdb) display a
(gdb) display a
(gdb) layout asm (顯示匯編)
(gdb) layout split (同時顯示源碼和匯編)
(gdb) r
Starting program: /home/zhu_ying/GDBMultiFiles/xmain
Breakpoint 1, CAdd::add (this=0x7fffffffe2d0, a=@0x7fffffffe2dc, b=@0x7fffffffe2d8) at add.cpp:9
9 int ret = a + b;
Missing separate debuginfos, use: debuginfo-install libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64
顯示變量的類型:
(gdb) whatis ret
ptype:比whatis的功能更強,他可以提供一個結構的定義
設置變量的值:
(gdb) set variable a = 30
(gdb) set variable b = 3
退出函數:
(gdb) finish
終止本次調試:
(gdb) kill
Kill the program being debugged? (y or n)
附加:
file FILE 裝載指定的可執行文件進行調試。
clear 刪除剛才停止處的斷點
commands 命中斷點時,列出將要執行的命令
(gdb)list
(gdb) search add
Expression not found
有的時候,你會發現search命令總是提示“Expression not found”,這是因為當前行可能已經是最后一行了,特別是文件很短的時候。這里需要注意的是,任何list命令都會影響當前行的位置,並且由於每次都是多行輸出,所以對當前行的影響並非簡單地向前一行或者向后一行。
search命令本身也會影響當前行的位置。
逆向檢索add關鍵字:
(gdb) reverse-search .*add.*
7 int CAdd::add(int &a, int &b)
若第n行被索引到,則下次搜索會從第n行開始。
跳過斷點2之后的5個斷點
(gdb) ignore 2 5
例如:watch a可以設置觀察點watchpoint a,一旦變量a的值發生變化,程序就會停在它發生變化的那個位置
1. Breakpoint: 作用是讓程序執行到某個特定的地方停止運行 (1)設置breakpoint: a. break function: 在函數funtion入口處設置breakpoint b. break +offset: 在程序當前停止的行向前offset行處設置breakpoint c. break –offset: 在程序當前停止的行向衙offset行處設置breakpoint d. break linenum: 在當前源文件的第linenum行處設置breakpoint e. break filename:linenum: 在名為filename的源文件的第linenum行處設置breakpoint f. break filename:function: 在名為filename的源文件中的function函數入口處設置breakpoint g. break *address: 在程序的地址address處設置breakpoint h. break … if cond: …代表上面講到的任意一個可能的參數,在某處設置一個breakpoint, 但且僅但cond為true時,程序停下來 i. tbreak args: 設置一個只停止一次的breakpoints, args與break命令的一樣。這樣的breakpoint當第一次停下來后,就會被自己刪除 k. rbreak regex: 在所有符合正則表達式regex的函數處設置breakpoint (2)info breakpoints [n]: 查看第n個breakpoints的相關信息,如果省略了n,則顯示所有breakpoints的相關信息 (3)pending breakpoints: 是指設置在程序開始調試后加載的動態庫中的位置處的breakpoints a. set breakpoint pending auto: GDB缺省設置,詢問用戶是否要設置pending breakpoint b. set breakpoint pending on: GDB當前不能識別的breakpoint自動成為pending breakpoint c. set breakpoint pending off: GDB當前不能識別某個breakpoint時,直接報錯 d. show breakpoint pending: 查看GDB關於pending breakpoint的設置的行為(auto, on, off) (4)breakpoints的刪除: a. clear: 清除當前stack frame中下一條指令之后的所有breakpoints b. clear function & clear filename:function: 清除函數function入口處的breakpoints c. clear linenum & clear filename:linenum: 清除第linenum行處的breakpoints d. delete [breakpoints] [range…]: 刪除由range指定的范圍內的breakpoints,range范圍是指breakpoint的序列號的范圍 (5)breakpoints的禁用、啟用: a. disable [breakpoints] [range…]: 禁用由range指定的范圍內的breakpoints b. enable [breakpoints] [range…]: 啟用由range指定的范圍內的breakpoints c. enable [breakpoints] once [range…]: 只啟用一次由range指定的范圍內的breakpoints,等程序停下來后,自動設為禁用 d. enable [breakpoints] delete [range…]: 啟用range指定的范圍內的breakpoints,等程序停下來后,這些breakpoints自動被刪除 (6)條件breakpoints相關命令: a. 設置條件breakpoints可以通過break … if cond來設置,也可以通過condition bnum expression來設置,在這里首先要通過(1)中介紹的命令設置好breakpoints,然后用condition命令來指定某breakpoint的條件,該breakpoint由bnum指定,條件由expression指定 b. condition bnum: 取消第bnum個breakpoint的條件 c. ignore bnum count: 第bnum個breakpoint跳過count次后開始生效 (7)指定程序在某個breakpoint處停下來后執行一串命令: a. 格式:commands [bnum] … command-list … end b. 用途:指定程序在第bnum個breakpoint處停下來后,執行由command-list指定的命令串,如果沒有指定bnum,則對最后一個breakpoint生效 c. 取消命令列表: commands [bnum] end d. 例子: break foo if x>0 commands silent printf “x is %d\n”,x continue end 上面的例子含義:當x>0時,在foo函數處停下來,然后打印出x的值,然后繼續運行程序 2. Watchpoint: 它的作用是讓程序在某個表達式的值發生變化的時候停止運行,達到‘監視’該表達式的目的 (1)設置watchpoints: a. watch expr: 設置寫watchpoint,當應用程序寫expr, 修改其值時,程序停止運行 b. rwatch expr: 設置讀watchpoint,當應用程序讀表達式expr時,程序停止運行 c. awatch expr: 設置讀寫watchpoint, 當應用程序讀或者寫表達式expr時,程序都會停止運行 (2)info watchpoints: 查看當前調試的程序中設置的watchpoints相關信息 (3)watchpoints和breakpoints很相像,都有enable/disabe/delete等操作,使用方法也與breakpoints的類似 3. Catchpoint: 的作用是讓程序在發生某種事件的時候停止運行,比如C++中發生異常事件,加載動態庫事件 (1)設置catchpoints: a. catch event: 當事件event發生的時候,程序停止運行,這里event的取值有: 1)throw: C++拋出異常 2)catch: C++捕捉到異常 3)exec: exec被調用 4)fork: fork被調用 5)vfork: vfork被調用 6)load: 加載動態庫 7)load libname: 加載名為libname的動態庫 8)unload: 卸載動態庫 9)unload libname: 卸載名為libname的動態庫 10)syscall [args]: 調用系統調用,args可以指定系統調用號,或者系統名稱 b. tcatch event: 設置只停一次的catchpoint,第一次生效后,該catchpoint被自動刪除 (2)catchpoints和breakpoints很相像,都有enable/disabe/delete等操作,使用方法也與breakpoints的類似