gdb調試5--工程項目的斷點調試


之前說過斷點調試,但是針對的是單文件的斷點調試。在實際應用中,一個項目是多目錄多文件的

 參考資料: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.h

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 }
add.cpp

上層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 *~
makefile

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 *~
makefile

 

調試:

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. breakif 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的取值有:

1throw: C++拋出異常
2catch: 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的類似

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM