在Red Hat Linux 5.4 中已經安裝了gcc的編譯器以及gdb調試器,因此本文先不學習安裝。
要用gdb調試可執行程序,必須在用gcc生成可執行程序的時候加入 -g 的參數。
如:gcc -o bug01 -g bug01.c
生成bug01后就可以用命令:
gdb bug01進入gdb的界面。
然後就可以開始使用命令,以下是常用的命令
PS:可以在gdb下鍵入兩次Tab,運行“help command”可以查看命令command的詳細使用格式。
-----------------------------------------------------------------
[0001] list
顯示程序中的代碼,常用格式有:
list
輸出從上次調用list命令開始往後的10行程序代碼。
list -
輸出從上次調用list命令開始往前的10行程序代碼。
list n
輸出第n行附近的10行程序代碼。
list function
輸出函數function前後的10行程序代碼。
-----------------------------------------------------------------
[0002] forward 或者 search
從當前行向後查找匹配某個字符的程序行。使用格式:
forward 或者 search 字符串
查找到的行號將保存在$_變量中,可以用print $_ 命令來查看。
-----------------------------------------------------------------
[0003] reverse-search
和[0002]剛好相反,向前查找字符串,格式同[0002]
-----------------------------------------------------------------
[0004] break
在程序中設置斷點,當程式運行到指定行上時,會暫停執行。使用格式:
break 要設置斷點的行號
-----------------------------------------------------------------
[0005] tbreak
設置臨時斷點,在設置之後只起作用一次,使用格式:
tbreak 要設置臨時斷點的行號
-----------------------------------------------------------------
[0006] clear
和break相反,用於清除斷點,使用格式:
-----------------------------------------------------------------
[0007] run
啟動程序,在run後面帶上參數可以傳遞給正在調試的程序。
-----------------------------------------------------------------
[0008] awatch
增加一個觀察點,使用格式:
awatch 變量或表達式
需要注意的是,awatch和watch都必須在程序運行的過程中設置觀察點,也就是說run后才能設置。
-----------------------------------------------------------------
[0009] watch
與awatch類似用來設置觀察點,但程序只有當表達式的值發生改變時才會停止運行,使用格式:
watch 變量或表達式
需要注意的是,awatch和watch都必須在程序運行的過程中設置觀察點,也就是說run后才能設置。
-----------------------------------------------------------------
[0010] commands
設置在遇到斷點后執行特定的指令。使用格式:
commands
設置遇到最後一個遇到的斷點時要執行的命令
commands n
設置遇到斷點號n時要執行的命令
注意,commands後面跟的是斷點號,不是行號。
-----------------------------------------------------------------
[0011] delete
清除斷點或自動顯示的表達式。使用格式:
delete 斷點號
-----------------------------------------------------------------
[0012] disable
指定斷點失效。使用格式:
disable 斷點號列表
斷點號之間用空格隔開。
-----------------------------------------------------------------
[0013] enable
和disable相反,恢復失效的斷點號。使用格式:
-----------------------------------------------------------------
[0014] ignore
忽略斷點。使用格式:
ignore 斷點號 忽略次數
-----------------------------------------------------------------
[0015] condition
設置斷點在一定條件下才能生效。使用格式:
condition 斷點號 條件表達式
-----------------------------------------------------------------
[0016] cout 或者 continue
使程序在暫停在斷點之後繼續運行。使用格式:
cout
跳過當前斷點繼續運行
cout n
跳過n次斷點,繼續運行
-----------------------------------------------------------------
[0017] jump
讓程序跳到指定行開始調試。使用格式:
jump 行號
-----------------------------------------------------------------
[0018] next
繼續執行語句,但是跳過子程序的調用,使用格式:
next
執行一條語句
next n
執行n條語句
-----------------------------------------------------------------
[0019] nexti
單步執行語句,但和next不同的是,他會追蹤到子程序內部,但不打印子程序內部的語句。使用格式:
同[0018]
-----------------------------------------------------------------
[0020] step
與next類似,追蹤到子程序內部,而且會顯示子程序內部的執行情況。使用格式:
同[0018]
-----------------------------------------------------------------
[0021] stepi
與step類似,但是比step更詳細,是next和step的結合,使用格式:
同[0018]
-----------------------------------------------------------------
[0021] whatis
顯示某個變量或表達式的數據類型。使用格式:
whatis 變量或表達式
-----------------------------------------------------------------
[0022] ptype
和whatis類似,用於顯示數據類型,但是它還可以顯示typedef定義的類型等。使用格式:
ptype 變量或表達式
-----------------------------------------------------------------
[0023] set
設置程序中變量的值,使用格式:
set 變量 = 表達式
-----------------------------------------------------------------
[0024] display
增加要顯示的值的表達式。使用格式:
display 表達式
-----------------------------------------------------------------
[0025] info display
顯示當前所有要顯示值的表達式。
-----------------------------------------------------------------
[0026] delete display 或者 undisplay
刪除要顯示值的表達式。使用格式:
delete display 或者 undisplay 表達式編號
-----------------------------------------------------------------
[0027] disable display
暫時不顯示一個要表達式的值。使用格式:
disable display 表達式編號
-----------------------------------------------------------------
[0028] enable display
與disable display相反,使用表達式回覆顯示。使用格式:
enable display 表達式編號
-----------------------------------------------------------------
[0029] print
打印變量或表達式的值。使用格式:
print 變量或表達式
表達式中有兩個符號有特殊含義:$和$$。
$表示給定序號的前一個序號,$$表示給定序號的前兩個序號。
如果$和$$後面不帶數字,則給定序號為當前序號。
-----------------------------------------------------------------
[0030] backtrace
打印指定個數的棧幀(stack frame)。使用格式:
backtrace 棧幀個數
-----------------------------------------------------------------
[0031] frame
打印棧幀。使用格式:
frame 棧幀號
-----------------------------------------------------------------
[0032] info frame
顯示當前棧幀的詳細信息。
-----------------------------------------------------------------
[0033] select-frame
選擇棧幀,選擇后可以用info frame來顯示棧幀信息。使用格式:
select-frame 棧幀號
-----------------------------------------------------------------
[0034] kill
結束當前程序的調試
-----------------------------------------------------------------
[0035] quit
退出gdb。
-----------------------------------------------------------------
[0036] info break
顯示已經設置的斷點。
-----------------------------------------------------------------
[0037] examine 或 x/
打印一段内存,相当有用,使用格式:
x/[n/f/u] 地址
n、f、u为可选参数。
n是一个正整数,表示需要显示内存单元的个数,一个内存单元
的大小由后面的u参数定义。
f表示显示的格式,如果地址所指的是字符串,那么可以填s
u表示从当前地址往后请求的字节数,如不指定默认4bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节,当我们指定了字节长度后,GDB会从指定内存的内存地址开始,读写指定字节,病把其当做一个值取出来。
例子:
x/16bx address
单字节16进制打印address地址处的长度为16的空间的内存,16表示空间长度不是16进制,x表示16进制,b表示byte单字节
-----------------------------------------------------------------