GDB調試命令精華講解

適合有入門GDB調試基礎的開發者,0基礎的同學建議查看其它資料

 

1、程序運行參數。
set args 可指定運行時參數。(如:set args -f 20 -t 40)
show args 命令可以查看設置好的運行參數。

2、運行環境。
path 可設定程序的運行路徑。
show paths 查看程序的運行路徑。
set environment varname [=value] 設置環境變量。如:set env USER=user
show environment [varname] 查看環境變量。

==[設置觀察點(WatchPoint)]=========================================
watch 一量表達式值有變化時,馬上停住程序。
rwatch 當表達式(變量)expr被讀時,停住程序。
awatch 當表達式(變量)的值被讀或被寫時,停住程序。

info watchpoints 列出當前所設置了的所有觀察點。==[爲停止點設定運行命令(很實用的強大的功能.)] =======================
commands [bnum]
... command-list ...
end
爲斷點號bnum指寫一個命令列表。當程序被該斷點停住時,gdb會依次運
行命令列表中的命令。

==[調試子進程]=======================================================
方法一:
GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試。
set follow-fork-mode [parent|child]
* parent: fork之後繼續調試父進程,子進程不受影響。
* child: fork之後調試子進程,父進程不受影響
(gdb) set follow-fork-mode child
(gdb) break 子進程行號
方法二:
使用GDB的attach命令.
attach命令可以綁定一個外部程序進行調試(可參考(gdb) help attach).
假設調試名爲test_proc進程的子進程.先使用
$ ps -ef | grep test_proc
找出其子進程的PID號.然後
(gdb) attach <子進程的PID>
進行調試.之後,用detach命令終止調試.

可以把follow-fork-mode和attach混合使用,用來調試正在運行的程序的子進程.


----------------------------------------------分割線-----------------------------------------------------------------

GDB Layout命令

命令功能

layout src顯示源碼窗口

layout asm顯示彙編窗口

layout split顯示源碼 & 彙編窗口

layout regs顯示彙編 & 寄存器窗口

layout next下一個layout

layout prev上一個layout

C-x 1單窗口模式

C-x 2雙窗口模式

C-x a回到傳統模式

GDB 跳轉執行命令

命令功能

start開始啓動程序,並停在main第一句等待命令
觀察點

當待觀察點被讀 或 被寫時,程序停下來,並輸出相關信息

命令功能

watch設置寫觀察點

rwatch設置讀觀察點

awatch設置讀寫觀察點

info watchpoints查看觀察點列表

Display跟蹤點

display var每次停下來時,顯示設置的變量var的值

undisplay取消跟蹤顯示

info display設置讀寫觀察點

info watchpoints查看跟蹤列表

忽略前面的某個斷點

ignore 2 5 //忽略斷點2 的前面 5 次,到第 6 次才停止


使用 examine 命令查看內存地址中的值。格式是x /<n/f/u> <addr>,其中<addr>是內存地址。

查看內存數據
在調試代碼時,經常需要查看某塊內存的數據,此時就需要使用GDB中的Examining memory。
可以使用命令x(即examine)來檢查任意格式的內存數據,不管你的程序數據類型。使用的格式爲:

x  /nfu addr
x addr  
其中n/f/u 是選項參數,指定內存的大小及顯示格式;addr 指定顯示的內存的起始地址。n 是十進制的整數,指定小時內存的大小;f 指定顯示的格式,它的使用與 GDB 中的 print 使用的格式一樣,如x指定使用 16 進制顯示, d按十進制格式顯示等;u 是指每個顯示單元的大小,如b是指每個顯示單元爲 byte,h是指每個顯示單元爲半字(兩個 byte)等;addr 指定要顯示的內存的起始地址。


分割窗口
layout 用於分割窗口,可以一邊查看代碼,一邊測試。主要有以下幾種用法:

layout src:顯示源代碼窗口
layout asm:顯示彙編窗口
layout regs:顯示源代碼彙編和寄存器窗口
layout split:顯示源代碼和彙編窗口
layout next:顯示下一個 layout
layout prev:顯示上一個 layout
Ctrl+L:刷新窗口
Ctrl+x,再按1:單窗口模式,顯示一個窗口
Ctrl+x,再按2:雙窗口模式,顯示兩個窗口
Ctrl+x,再按a:回到傳統模式,即退出 layout, 回到執行 layout 之前的調試窗口

查看寄存器
查看寄存器的值,很簡單,可以使用如下命令:

info registers, 查看寄存器的情況,除了浮點寄存器。
info all-registers, 查看所有寄存器的情況,包括浮點寄存器。
info registers , 查看所指定的寄存器的情況。
同樣可以使用 print 命令來訪問寄存器的情況,只需要在寄存器名字前加一個$符號就可以了,例如p $eip。


彙編調試
在做 ARM 彙編時,需要使用 GDB 對彙編語言進行單步調試,但很多時候,沒辦法直接通過stepi或nexti進入彙編函數內調試。使用了一個迂迴的方法:

設置斷點,在彙編函數名處先設置斷點。 break 。
直接顯示彙編代碼,layout asm;顯示寄存器值,layout regs。
單步執行彙編命令stepi和nexti。


(gdb) frame 1

當執行GDB的frame命令時,當前正在執行的函數的幀被編號爲0,其父幀(即該函數的調用者的棧幀)被編號爲1,父幀的父幀被編號爲2,以此類推。GDB的up命令將你帶到調用棧中的下一個父幀(例如,從幀0到幀1),down則引向相反方向。

顯示整個棧:backtrace

4 啓動文件的使用
在重新編譯代碼時,最好不要退出GDB。這樣,你的斷點和建立的其他各種動作都會保留。要是退出GDB,就不得不再次重複鍵入這些內存。

然而,在完成調試前可能需要退出GDB。如果你要離開一段時間,而且不能保持登錄在計算機中,則需要退出GDB。爲了不丟失它們,可以將斷點和設置的其他命令放在一個GDB啓動文件中,然後每次啓動GDB時都會自動加載它們。

GDB的啓動文件默認名爲.gdbinit。

在調用GDB時可以指定啓動文件。例如,

$ gdb -command=z x

表示要在可執行文件x上運行GDB,首先要從文件z中讀取命令。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------分割線----------------------------------------

更多資料:http://lazybing.github.io/blog/2016/04/01/how-to-use-gdb/

http://notes.maxwi.com/2016/03/19/gdb/

http://beej.us/guide/bggdb/#compiling
https://www.jianshu.com/p/7e15d826a633

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章