gdb基本用法

當程序出錯併產生core 時
快速定位出錯函數的辦法
gdb 程序名 core文件名(一般是core,也可能是core.xxxx)

調試程序使用的鍵
r run 運行.程序還沒有運行前使用
c cuntinue 繼續運行。運行中斷後繼續運行
q 退出
kill 終止調試的程序
h help 幫助
<tab> 命令補全功能

step 跟入函數
next 不跟入函數
b breakpoint 設置斷點。
用法:
b 函數名 對此函數進行中斷
b 文件名:行號 對此文件中指定行中斷.假如是當前文件,那麼文件名與:號可以
省略
看當前斷點數使用info break.禁止斷點disable 斷點號.刪除delete 斷點號.

l list 列出代碼行。一次列10 行。連接使用list將會滾動顯示. 也可以在list 後面
跟上 文件名:行號
watch 觀察一個變量的值。每次中斷時都會顯示這個變量的值
p print 打印一個變量的值。與watch不同的是print只顯示一次
這裏在順便說說如何改變一個 value. 當你下指令 p 的時候,例如你用 p b,
這時候你會看到 b 的 value, 也就是上面的 $1 = 15.
你也同樣可以用 p 來改變一個 value, 例如下指令 p b = 100 試試看,
這時候你會發現, b 的 value 就變成 100 了:$1 = 100.



網上抄錄
基本的使用方法簡介
前言
程序代碼中的錯誤可分爲數類,除了最輕易除錯的語法錯誤,編譯程序會告訴你錯誤所在外,大部分的錯誤都可以歸類爲執行時錯誤。GDB 的功能便是尋找執行時錯誤。假如沒有除錯程序,我們只能在程序中加入輸出變量值的指令來了解程序執行的狀態。有了 GDB 除錯程序,我們可以設定在任何地方停止程序的執行,然後可以隨意檢視變量值及更動變量,並逐行執行程序。
一個除錯程序執行的流程通常是這樣的:

1. 進入除錯程序並指定可執行文件。
2. 指定程序代碼所在目錄。
3. 設定斷點後執行程序。
4. 程序於斷點中斷後,可以 (1)檢視程序執行狀態;檢視變量值或變更變量值 (2) 逐步執行程序,或是全速執行程序到下一個斷點或是到程序結束爲止。
5. 離開除錯程序。
以下將分爲下列數項分別介紹:
1. 進入 GDB 及指定可執行檔
2. 指定程序代碼所在目錄及檢視程序代碼
3. 斷點的設定與清除
4. 全速及逐步執行程序
5. 檢視及更改變量值
6. 檢視程序執行狀態
7. 讀取 Core 文件信息
進入 GDB 及指定可執行檔:
1. 進入 GDB 並讀入可執行檔 (檔名爲 'PROGRAM'),預備進行除錯。
gdb PROGRAM
指定程序代碼所在目錄及檢視程序代碼
1. 增加目錄 DIR 到收尋程序代碼的目錄列表 (假如你的程序代碼和可執行檔放在同一個目錄下,就不須指定程序代碼所在目錄。):
(gdb) Directory DIR

2. 檢視程序代碼,格式計有:
(gdb) list => 顯示目前執行程序代碼前後各五行的程序代碼;或是顯示從上次 list 之後的程序代碼
(gdb) list function => 顯示該程序開始處前後五行的程序代碼。
(gdb) list - =>上次顯示程序代碼的前面的十行。
斷點的設定與清除
1. 設定斷點(指令爲 break,可簡寫爲 (b),格式計有:
(gdb) break filename.c:30 => 在 filename.c 的第三十行處停止執行。
(gdb) break function => 在進入 function 時中斷程序的執行。
(gdb) break filename.c:function => 在程序代碼檔 filename.c 中的函數 function 處設定斷點。
(gdb) break => 在下一個將被執行的命令設定斷點。
(gdb) break ... if cond => 只有當 cond 成立的時候才中斷。cond 須以 C 語言的語法寫成。

2. 顯示各個斷點的信息。
(gdb) info break

3. 清除斷點(命令爲 clear),格式同 break 。例如 :
(gdb) clear filename.c:30

4. 清除斷點,NUM 是在 info break 顯示出來的斷點編號。
(gdb) delete NUM
全速及逐步執行程序
1. 從程序開頭全速執行程序,直到碰到斷點或是程序執行完畢爲止。
(gdb) run

2. 在程序被中斷後,全速執行程序到下一個斷點或是程序結束爲止 (continue 指令可簡寫爲 c)。
(gdb) continue

3. 執行一行程序. 若呼叫函數, 則將該包含該函數程序代碼視爲一行程序 (next 指令可簡寫爲 n)。

(gdb) next

4. 執行一行程序. 若呼叫函數, 則進入函數逐行執行 (step 指令可簡寫爲 s)。
(gdb) step

5. 執行一行程序,若此時程序是在 for/while/do loop 循環的最後一行,則一直執行到循環結束後的第一行程序後停止 (until 指令可簡寫爲 u)。
(gdb) until

6. 執行現行程序到回到上一層程序爲止。
(gdb) finish
檢視及更改變量值
1. print 敘述,顯示該敘述執行的結果 (print 指令可簡寫爲 p)。如
(gdb) print a => 顯示 a 變量的內容.
(gdb) print sizeof(a) => 顯示 a 變量的長度.

2. display 敘述,在每個斷點或是每執行一步時顯示該敘述值。如
(gdb) display a

3. 更改變量值:
(gdb) print (a=10) => 將變量 a 的值設定爲 10.

檢視程序執行狀態
1. 查看程序執行到此時,是經過哪些函數呼叫的程序 (backtrace 指令可簡寫爲 BT),也就是查看函數呼叫堆棧。
(gdb) backtrace
讀取 Core 文件信息
1. 讀入 PROGRAM 及 PROGRAM.CORE 檔,可檢視 Core Dump 時程序變量值及程序流程狀態 。
gdb PROGRAM core
說明:'core' 檔案是由 PROGRAM 檔執行後,碰到 Core Dump 時產生的 Core 檔檔名。假如你還需要該 Core 檔,我們建議你將該檔案檔名更改爲 PROGRAM.core。在輸入上述命令後,你可以用 GDB 提供的檢視變量值以及檢視程序執行狀態來讀取程序 Core Dump 時的狀態。

補充一點兒
(最近我剛在用gdb,感覺還不錯,不過有的時候還是眼睛加printf更好
使)
我更多是用gdb直接調試程序,而不是core

gdb 可執行文件名 (進入gdb環境)

set ags -? (設置參數,即向你要調試的程序傳參)

另外,用break functionName 和break lineNum都可以設置斷點
用info break 可以查看當前斷點的信息
用clear清除斷點的時候要和break相對應
假如是用functionName設置的斷點就只能 clear functionName
用lineNum設置的斷點就只能用clear lineNum

BTW:可以到www.sunfreeware.com去下載gdb

以上是我近幾天學習gdb的一點經驗,都是我犯過錯誤的地方
希望對與我等同類的gdb菜鳥們有所幫助。

假如是剛開始時也可以使用ddd
圖形化的

另外對於斷點可以使用
delete 斷點號
刪除
斷點號可以使用info break 得到

我也說說我的體會:
r (程序運行的參數) 可以設置運行時的參數
shell 運行shell環境的東西,比如shell make,完了以後直接r重新啓動程序,就可以帶上次已經加過的參數運行,不用再敲參數了
b 文件名:行號 有的時候很有用,嘿嘿
info b 看斷點信息
disable 斷點號 暫停某個斷點
enable 斷點號 啓動某個斷點
delete (斷點號) 刪除某個斷點,不帶斷點號,全部刪除
x/32uxb 指針 以16進制顯示該指針指向的32個字節的數據

Linux的c編程中大家經常用gdb調試程序,以下是一些常用的指令
1.break FUNCTION
在某個函數上設置斷點。函數重載時,有可能同時在幾個重載的函數上設置了斷點

break +OFFSET
break -OFFSET
在當前程序運行到的前幾行或後幾行設置斷點

break LINENUM
在行號爲LINENUM的行上設置斷點

break FILENAME:LINENUM
在文件名爲FILENAME的原文件的第LINENUM行設置斷點

break FILENAME:FUNCTION
在文件名爲FILENAME的FUNCTION函數上設置斷點
當你的多個文件中可能含有相同的函數名時必須給出文件名。

break *ADDRESS
在地址ADDRESS上設置斷點,這個命令答應你在沒有調試信息的程序中設置斷點

break
當break命令不包含任何參數時,break命令在當前執行到的程序運行棧中的
下一條指令上設置一個斷點。除了棧底以外,這個命令使程序在一旦從當前
函數返回時停止。相似的命令是finish,但finish並不設置斷點。這一點在
循環語句中很有用。gdb在恢復執行時,至少執行一條指令。

break ... if COND
這個命令設置一個條件斷點,條件由COND指定;在gdb每次執行到此斷點時
COND都被計算當COND的值爲非零時,程序在斷點處停止

ignore BNUM COUNT'
設置第BNUM號斷點的被忽略的次數爲'COUNT',即斷點BNUM再執行到第COUNT+1
次時程序停止

tbreak ARGS 或者簡寫爲 tb
設置斷點爲只有效一次。ARGS的使用同break中的參量的使用

hbreak ARGS
設置一個由硬件支持的斷點。這個命令的主要目的是用於對EPROM/ROM程序的調試
因爲這條命令可以在不改變代碼的情況下設置斷點。這可以同SPARCLite DSU一起
使用。當程序訪問某些變量和代碼時,DSU將設置“陷井”。注重:你只能一次使用
一個斷點,在新設置斷點時,先刪除原斷點

thbreak ARGS'
設置只有一次作用的硬件支持斷點

rbreak REGEX
在所有滿足表達式REGEX的函數上設置斷點。這個命令在所有相匹配的函數上設置無
條件斷點,當這個命令完成時顯示所有被設置的斷點信息。這個命令設置的斷點和
break命令設置的沒有什麼不同。當調試C++程序時這個命令在重載函數上設置斷點時
非常有用。

info breakpoints [N]
info break [N]
info watchpoints [N]
顯示所有的斷點和觀察點的設置表,有下列一些列
*Breakpoint Numbers*----斷點號
*Type*----斷點類型(斷點或是觀察點)
*Disposition*---顯示斷點的狀態
*Enabled or Disabled*---使能或不使能。'y'表示使能,'n'表示不使能。
*Address*----地址,斷點在你程序中的地址(內存地址)
*What*---地址,斷點在你程序中的行號。
假如斷點是條件斷點,此命令還顯示斷點所需要的條件。
帶參數N的'info break'命令只顯示由N指定的斷點的信息。
此命令還顯示斷點的運行信息(被執行過幾次),這個功能在使用'ignore'
命令時很有用。你可以'ignore'一個斷點許多次。使用這個命令可以查看斷點
被執行了多少次。這樣可以更快的找到錯誤。

maint info breakpoints
顯示所有的斷點,無論是你設置的還是gdb自動設置的。
斷點的含義:
breakpoint:斷點,普通斷點
watchpoint:普通觀察點
longjmp:內部斷點,用於處理'longjmp'調用
longjmp resume:內部斷點,設置在'longjmp'調用的目標上
until:'until'命令所使用的內部斷點
finish:finish'命令所使用的內部斷點

2.watch EXPR
爲表達式(變量)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序。
這個命令使用EXPR作爲表達式設置一個觀察點。GDB將把表達式加入到程序中並監
視程序的運行,當表達式的值被改變時GDB就使程序停止。這個也可以被用在SPARClite
DSU提供的新的自陷工具中。當程序存取某個地址或某條指令時(這個地址在調試寄
存器中指定),DSU將產生自陷。對於數據地址DSU支持'watch'命令,然而硬件斷點寄
存器只能存儲兩個斷點地址,而且斷點的類型必須相同。就是兩個'rwatch'型斷點

或是兩個'awatch'型斷點。

rwatch EXPR'
設置一個觀察點,當EXPR被程序讀時,程序被暫停。

awatch EXPR'
設置一個觀察點,當EXPR被讀出然後被寫入時程序被暫停。

info watchpoints
在多線程的程序中,觀察點的作用很有限,GDB只能觀察在一個線程中的表達式的值
假如你確信表達式只被當前線程所存取,那麼使用觀察點纔有效。GDB不能注重一個
非當前線程對表達式值的改變。

rwatch <expr>
當表達式(變量)expr被讀時,停住程序。

awatch <expr>
當表達式(變量)的值被讀或被寫時,停住程序。

info watchpoints
列出當前所設置了的所有觀察點。


3.catch EXCEPTIONS
使用這個命令在一個被激活的異常處理句柄中設置斷點。EXCEPTIONS是一個你要抓住
的異常。你一樣可以使用'info catch'命令來列出活躍的異常處理句柄。

GDB中對於異常處理由以下情況不能處理:
* 假如你使用一個交互的函數,當函數運行結束時,GDB將象普通情況一樣把控制返
回給你。假如在調用中發生了異常,這個函數將繼續運行直到碰到一個斷點,一個信號
或是退出運行。
* 你不能手工產生一個異常( 即異常只能由程序運行中產生 )
* 你不能手工設置一個異常處理句柄。
有時'catch'命令不一定是調試異常處理的最好的方法。假如你需要知道異常產生的
確切位置,最好在異常處理句柄被調用以前設置一個斷點,這樣你可以檢查棧的內容。
假如你在一個異常處理句柄上設置斷點,那麼你就不輕易知道異常發生的位置和原因。
要僅僅只在異常處理句柄被喚醒之前設置斷點,你必須瞭解一些語言的實現細節。

3.cont N
第N次經過該斷點時才停止程序運行

4.enable 斷點編號
恢復暫時失活的斷點,要恢復多個編號的斷點,可用空格將編號分開

5.disable 斷點編號
使斷點失效,但是斷點還在

6.delete 斷點編號或者表達式
刪除某斷點

7.clear 斷點所在行號
清除某斷點

8.查看斷點列表
info break

9.watch counter>15
當counter>15的時候程序終止

10.當程序崩潰的時候linux會生成一個core文件,可以用
gdb a.out core
where
查看導致崩潰的原因

11.continue
恢復程序運行,直到碰到下一個斷點

12.run
程序開始運行,直到碰到斷點

13.step
執行一行代碼

14.next
和s不同的是他不跟蹤到代碼的內部,一步一步執行代碼

15.直接回車爲執行上一個命令

16.print 變量
打印某一變量的值

17.display 變量
每次運行到斷點就顯示變量的值,用於觀察變量的變化

18.set 變量=
在程序執行中重新設置某變量的值

19.printf "%2.2s/n",(char*)0x120100fa0
結果打印出:He

20. 設置gdb的列寬,以下爲將屏幕設置爲70列
set width 70

21. info args 列出你程序所接受的命令行參數
info registers列出寄存器的狀態
info breakpoint列出在程序中設的斷點
要獲得具體的關於info的信息用help info.

22. set
這個命令用來爲你的程序設置一個運行環境(使用一個表達式)。
set prompt $把gdb的提示符設爲$.
set args 可指定運行時參數。(如:set args 10 20 30 40 50)
show args 命令可以查看設置好的運行參數。

23. show
show命令用來顯示gdb自身的狀態。
使用'set'命令可以改變絕大多數由'show'顯示的信息
使用show radix命令來顯示基數
用不帶任何參變量的'set'命令可以顯示所有可以設置的變量的值
有三個變量是不可以用'set'命令來設置的:
show version顯示gdb的版本號
show copying顯示版權信息
show warranty顯示擔保信息
發佈了4 篇原創文章 · 獲贊 3 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章