gdb是一個功能很強大的調試器,它是一個自由軟件,能夠使用在很多的UNIX平臺上,它同時也是linux系統默認的調試器。
一般來說,GDB主要幫忙你完成下面四個方面的功能:
1、啓動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、動態的改變你程序的執行環境。
1.啓動gdb
首先程序編譯時,必須加入調試信息
cc -g -o test test.c
gdb test
2.運行一個程序
進入gdb後,輸入run命令,運行程序,可以發現程序中錯誤的地方。
可以簡寫r
3.棧跟蹤
backtrace命令可以查出程序是如何到達某一個位置。追蹤函數的相互調用關係。
簡寫bt.
4.檢查變量
gdb在停止程序時給出的信息以及跟蹤棧得到的信息可以讓我們看到函數參數的取值。
使用print 可以顯示參數的取值。gdb將結果保存在僞變量$<number>中,最後一次的操作結果總是$
倒數第二次的操作結果是$$
數組顯示 print array[0]@5;
file::variable
function::variable
5.列出程序的源代碼
list 簡寫l
6.設置斷點
help breakpoint 查看斷點的幫助信息
break <linenum>
在指定行號停住。
break +offset
break -offset
在當前行號的前面或後面的offset行停住。offiset爲自然數。
break filename:linenum
在源文件filename的linenum行處停住。
break filename:function
在源文件filename的function函數的入口處停住。
break *address
在程序運行的內存地址處停住。
break
break命令沒有參數時,表示在下一條指令處停住。
break ... if <condition>
...可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設置break if i=100,表示當i爲100時停住程序。
查看斷點時,可使用info命令,如下所示:(注:n表示斷點號)
info breakpoints [n]
info break [n]
cont /繼續運行
next ..n 執行下一條語句
display 每次到斷點時自動的顯示變量的內容。
在程序到達斷點時,不是停下來而是執行一定的命令。可以使用command +end 。
7.gdb也可以運行shell命令
shell <command>
8.設置觀察點
觀察點一般來觀察某個表達式(變量也是一種表達式)的值是否有變化了,如果有變化,馬上停住程序。我們有下面的幾種方法來設置觀察點:
watch <expr>
爲表達式(變量)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。
rwatch <expr>
當表達式(變量)expr被讀時,停住程序。
awatch <expr>
當表達式(變量)的值被讀或被寫時,停住程序。
info watchpoints
列出當前所設置了的所有觀察點。
8.在GDB中運行程序
————————
當以gdb <program>方式啓動gdb後,gdb會在PATH路徑和當前目錄中搜索<program>的源文件。
如要確認gdb是否讀到源文件,可使用l或list命令,看看gdb是否能列出源代碼。
在gdb中,運行程序使用r或是run命令。程序的運行,你有可能需要設置下面四方面的事。
1>、程序運行參數。
set args 可指定運行時參數。(如:set args 10 20 30 40 50)
show args 命令可以查看設置好的運行參數。
2>、運行環境。
path <dir> 可設定程序的運行路徑。
show paths 查看程序的運行路徑。
set environment varname [=value] 設置環境變量。如:set env USER=hchen
show environment [varname] 查看環境變量。
3>、工作目錄。
cd <dir> 相當於shell的cd命令。
pwd 顯示當前的所在目錄。
4>、程序的輸入輸出。
info terminal 顯示你程序用到的終端的模式。
使用重定向控制程序輸出。如:run > outfile
tty命令可以指寫輸入輸出的終端設備。如:tty /dev/ttyb
9線程(Thread Stops)
如果你程序是多線程的話,你可以定義你的斷點是否在所有的線程上,或是在某個特定的線程。
GDB很容易幫你完成這一工作。
break <linespec> thread <threadno>
break <linespec> thread <threadno> if ...
linespec指定了斷點設置在的源程序的行號。threadno指定了線程的ID,注意,
這個ID是GDB分配的,你可以通過“info threads”命令來查看正在運行程序中的線程信息。如果你不指定thread <threadno>則表示你的斷點設在所有線程上面。你還可以爲某線程指定斷點條件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
當你的程序被GDB停住時,所有的運行線程都會被停住。這方便你你查看運行程序的總體情況。
而在你恢復程序運行時,所有的線程也會被恢復運行。那怕是主進程在被單步調試時。