GDB基本用法

一、編譯運行

1.1、程序帶調(diào)試信息

????使用額外的 '-g' 選項來編譯程序:

gcc -g eg.c -o eg


1.2 運行 gdb

裝載程序

方法一:在 shell 中,可以使用 'gdb' 命令并 指定程序名 作為參數(shù)來運行 gdb

gdb + 程序名

方法二:在 gdb 中,可以使用 file 命令來裝入要調(diào)試的程序

(gdb)file + 文件名

兩種方式都假設(shè)您是在包含程序的目錄中執(zhí)行命令。

命令? ? ? ? ? ? ? ?縮寫????????????????????????????功能

run? ? ? ? ? ? ? ? ? ?r???????????? ????????????????運行程序

continue? ? ? ? ? c (fg)? ? ? ? ? ?繼續(xù)執(zhí)行直到下一次斷點

until +行號? ? ? ?u? ? ? ? ? ? ? ? ? ? ? ?繼續(xù)執(zhí)行直到指定行

每次執(zhí)行結(jié)束重新輸入 run 可重新執(zhí)行

參數(shù)設(shè)置

裝入程序之后,可以用 gdb 命令 'run + 運行參數(shù)' 來啟動程序。

run + 參數(shù)? ? ? ? ? ? ? ? ? ? # 啟動程序 或者? restart?

或者在執(zhí)行run前 通過 set args + 運行參數(shù) 設(shè)置

set args + 運行參數(shù)

run

如果一切正常,程序?qū)?zhí)行到結(jié)束(要是不想讓其結(jié)束要提前設(shè)置斷點),此時 gdb 將重新獲得控制。

1.3 退出gdb

quit [退出條件]? ? ? ? ? ? ? ? ? ? ?# 退出gdb

二、調(diào)試命令

2.1?設(shè)置斷點

普通斷點

命令????????縮寫? ? ????用法1????????????????用法2????????????????????????????????????????用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

break? ? ? ?b? ? ? ? ? ? b + 函數(shù)名? ? ? ? ?b + 行號(文件名:行號)? ? ????b + *地址(*0x7c00)? ? ??

查看斷點

info breakpoints

條件斷點

(1) break + .. + if? 條件

(2) condition 斷點號 條件

根據(jù)規(guī)則設(shè)置斷點

rbreak printNum*? ? ? ? ? ? #所有以printNum開頭的函數(shù)都設(shè)置了斷點

rbreak .? ? ? ? ? ? ? ? ? ? ? ? ? ?#對所有函數(shù)設(shè)置斷點

rbreak test.c: . ????????????????#對test.c中的所有函數(shù)設(shè)置斷點

rbreak test.c:^print ????????#對以print開頭的函數(shù)設(shè)置斷點

臨時斷點

斷點只想生效一次,可以設(shè)置臨時斷點

tbreak test.c:l0? #在第10行設(shè)置臨時斷點

刪除斷點

clear? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除當前行所有breakpoints

clear function? ????????????????????????????????#刪除函數(shù)名為function處的斷點

clear filename:function? ? ? ? ? ? ? ? ? ? #刪除文件filename中函數(shù)function處的斷點

clear lineNum? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除行號為lineNum處的斷點

clear filename:lineNum ????????????????#刪除文件filename中行號為lineNum處的斷點

delete? ????????????????????????????????????????????#刪除所有breakpoints,watchpoints和catchpoints

delete bnum ????????????????????????????????????#刪除斷點號為bnum的斷點

跳過多次設(shè)置斷點

ignore +? 斷點號? +? ?忽略次數(shù)

Num? ? Type? ? ? ? ? Disp Enb Address? ? ? ? ? ? What

1? ? ? breakpoint? ? keep y? 0x00000000004005e8 in printNum2 at test.c:16? ignore next 30 hits

根據(jù)表達式值變化產(chǎn)生斷點

需要觀察某個值或表達式,知道它什么時候發(fā)生變化

watch + 變量或者表達式的值

watch + 條件

讓程序繼續(xù)運行,如果值發(fā)生變化,則會打印相關(guān)內(nèi)容,如:

Hardware watchpoint 2: a

Old value = 12

New value = 11

其? info breakpoints 信息

Num ???? Type ???????????????? Disp ????????Enb ????????????Address ???????? What

2? ? ? ???? hw watchpoint? ????keep ????????y? ? ? ? ? ? ? ? ? ? ? a? ?????????????breakpoint already hit 11 times

禁用或啟動斷點

有些斷點暫時不想使用,但又不想刪除,可以暫時禁用或啟用。例如:

disable? ????????????????????????????#禁用所有斷點

disable bnum? ? ? ? ? ? ? ? ? ? #禁用標號為bnum的斷點

enable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟用所有斷點

enable bnum ????????????????????#啟用標號為bnum的斷點

enable delete bnum? ????????#啟動標號為bnum的斷點,并且在此之后刪除該斷點


2.2 單步執(zhí)行

命令????????縮寫? ? ????用法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1

next? ? ? ? ? ?n? ? ? ? ? 執(zhí)行一行源程序代碼,不進入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?n + 步數(shù)

step? ? ? ? ? ?s? ? ? ? ? 執(zhí)行一行源程序代碼,單步跟蹤進入函數(shù)? ? ? ? ? ? ? ? ? s?+ 步數(shù)

nexti? ? ? ? ? ?ni? ? ? ? ? 執(zhí)行一行匯編程序代碼,不進入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ni + 步數(shù)

stepi? ? ? ? ? ?si? ? ? ? ? 執(zhí)行一行匯編程序代碼,單步跟蹤進入函數(shù)? ? ? ? ? ? ?si + 步數(shù)

finish???????????????????????跳過該函數(shù),繼續(xù)后面的執(zhí)行

2.3 查看變量

在查看變量之前,需要先啟動調(diào)試并設(shè)置斷點

命令? ? ?縮寫? ? ? ?   用法1? ? ? ? ? ? ? ????????????????????????????用法2? ? ? ? ? ? ? ? ? ? ??

print? ? ? ?p? ? ?   ? p + 變量名? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p + 數(shù)組名? ? ??

?命令? ? ?縮寫? ? ? ? ?   用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4????????????????????????????用法5

print? ? ? ?p?? ? ? ? ? ? ? p + 文件名(函數(shù)名) :: 變量名? ? ? ? p + *(地址或指針)? ? ? ? p + *指針@數(shù)量

環(huán)境變量$

$? 可表示上一個變量,假設(shè)此時有一個鏈表linkNode,它有next成員代表下一個節(jié)點,則可使用下面方式不斷打印鏈表內(nèi)容:

(gdb) p *linkNode? ? ? ? ? ? #顯示linkNode節(jié)點內(nèi)容

(gdb) p *$.next? ? ? ? ? ? ? ? #顯示linkNode節(jié)點下一個節(jié)點的內(nèi)容

如果想要查看前面數(shù)組的內(nèi)容,你可以將下標一個一個累加,還可以定義一個類似UNIX環(huán)境變量,這樣就不需要每次修改下標去打印,例如:

(gdb) set $index=0

(gdb) p b[$index++]

$11 = 1

(gdb) p $pc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 當前指令

2.4 打印格式

x 按十六進制格式顯示變量。????????d 按十進制格式顯示變量。????????????o 按八進制格式顯示變量。

t 按二進制格式顯示變量。????????????c 按字符格式顯示變量。????????????????f 按浮點數(shù)格式顯示變量。

(gdb) p/x c

2.5 查看內(nèi)存

命令? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????用法1? ? ? ? ? ? ??

? ?x? ? ? ? ? ? ? ?查看內(nèi)存內(nèi)容 ????????x / [n內(nèi)存單元數(shù)] [f格式] [u單元長度] addr地址? ? ?

格式

t 二進制? ? ? ? ? ?????x 十六進制? ? ? ? ? ? ????d 十進制? ? ? ? ? ? o 八進制????????????????????????u 十進制無符號

c 字符? ? ? ? ? ? ?????s 字符串? ? ? ? ? ? ? ? ????f 浮點數(shù)? ? ? ? ? ? ?z 零拓展十六進制? ? ? ? ? a? 地址單元的長度? ? ?

i 指令地址格式? ? ?

單元長度

b 字節(jié)????????????h? 雙字節(jié)????????????????w? 四字節(jié)????????????g 八字節(jié)

默認是4個byte

查看堆棧信息

x /8x $esp


2.6 自動顯示變量

程序斷住時,就顯示某個變量的值

命令? ? ? ? ? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1

display? ? ? ? ? ? ? ?查看變量名? ? ? ? ? ? ?display + 變量名

清除變量

delete display num ????????????# num變量的編號,不帶num時清除所有變量

去使能

disable display num????????? # num為變量的編號,不帶num時去使能所有

2.4 info

命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 縮寫? ? ? ? ? ????????? 功能

info? breakpoints? ? ? ? ? ?i? b? ? ? ????????????查看已設(shè)置斷點

info? watchpoints? ? ? ? ? ?i? wat? ? ? ? ? ? ? 查看已設(shè)置觀測點

info registers? ? ? ? ? ? ? ? ?i? r? ? ???????????????查看所有寄存器

info skip? ? ? ? ? ? ? ? ? ? ? ? i? s???????????????????查看所有需要跳過的函數(shù)?

info local? ? ? ? ? ? ? ? ? ? ? ?i lo? ? ? ? ? ? ? ? ? ? 查看當前函數(shù)局部變量

help? info可查看更多

2.7 skip

命令? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????功能

skip + 函數(shù)名????????????????????單步執(zhí)行時跳過一些不想關(guān)注的函數(shù)

skip? file + 文件名? ? ? ? ? ? ?單步執(zhí)行時跳過某個文件的代碼

skip delete [num]? ? ? ? ? ? ? 刪除對應(yīng)編號skip

skip enable [num] ????????????使能對應(yīng)編號skip

skip disable [num] ????????????去使能對應(yīng)編號skip

三、查看源碼

3.1 list

list 列出指定行附件的源碼

命令? ? ? ? ? ? 縮寫? ? ? ? ? ? ? ? 用法1? ? ? ? ? ? 用法2? ? ? ? ? ? ? ? 用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4

list? ? ? ? ? ? ? ? ? l? ? ? ? ? ? ? ? ? ? l + 行號? ? ? ? l + 函數(shù)名? ? ? ? ? l 行號 , 行號(指定范圍)? ? ? l + 文件名:行號

set listsize 20? ? ? ? ? ? # 顯示 每次顯示的行數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯誤原因->產(chǎn)生新的現(xiàn)象去驗證假設(shè)”這樣一個循環(huán)過程,根據(jù)現(xiàn)象如何假設(shè)錯誤原...
    Manfred_Zone閱讀 16,746評論 0 26
  • 概述 GDB是一個由GNU開源組織發(fā)布的、UNIX/Linux操作系統(tǒng)下的、基于命令行的、功能強大的程序調(diào)試工具。...
    咕咕鷄閱讀 21,124評論 0 8
  • 調(diào)試前準備 獲取進程的內(nèi)核轉(zhuǎn)儲(core dump) why:最大好處是,其保存了問題發(fā)生時的狀態(tài)。記錄進程當前狀...
    Gitlusen閱讀 1,035評論 0 2
  • 放假了,最開心的事莫過于早上開機時。 “老師,祝您春節(jié)快樂!” “老師,春節(jié)愉快!雖然發(fā)的有些晚,但是心意不變噢!...
    魏喜梅wxm閱讀 625評論 12 11
  • 點進來你就輸了,單身狗沒有樂趣 點進來你就輸了,單身狗沒有樂趣 點進來你就輸了,單身狗沒有樂趣 言歸正傳,單身狗有...
    土_豆_粉閱讀 339評論 8 6

友情鏈接更多精彩內(nèi)容