設置多個窺探器調試:
set detach-on-fork off
set target-async on
set non-stop on
set pagination off
切換窺探器
inferior [1]
調試正在運行的進程
attach pid
detach
常用查看數據命令
print [格式] [表達式]
格式:
/f 作爲浮點數打印
/x 16進制格式
/t 使用二進制的格式打印
/a 作爲地址
/c 字符常量格式打印
表達式:
任何常量、變量或者語言中定義的操作符在表達式中都是合法的。支持常量數組,語法爲{ele, ele}。
支持的操作符包括@和::,@是二進制操作符,將內存的部分視作數組;::指定文件或者函數中定義的變量。
程序變量:
最常見的表達式使用變量名,表達式中的名字是在被選中的stack幀中理解,所以變量要麼是全局,要麼遵循作用域的規則而可見;
file::variable
function::variable
智能數組:
打印在內存中多個同類型對象很有用,例如數組的某段,或者指針指向的動態數組;
int *array = (int *)malloc(len * sizeof(int));
p *array@len: @左操作數必須駐留在內存中。
p &var: 打印某個變量的地址
inspect
x命令
x /nfu addr
n:重複次數
f:顯示格式
u:單元尺寸 b,h,w,g
自動顯示:
display expr: 將expr加入到表達式列表中
undisplay dnums: 根據編號從表達式列表移除表達式;
寄存器:
引用機器寄存器內存,在表達式中通過$+名字作爲變量
info registers:打印所有寄存器的名字和數值,除了浮點寄存器以外;
info all-registers:打印所有寄存器的值,包括浮點寄存器
打印設置:
set print address[on/off]: 打印內存地址,顯示棧的地址,數據結構值,
set print array [on/off]: 打印數組
set print elements [num]: 設置數組元素打印個數上線
set print pretty on
set print demangle: 按照原始形式打印C++名稱;
set print asm-demangle
set demangle-style {auto | gnu | hp | lucid | arm}
set print object :打印對象的指針
set print static-members :打印靜態成員
set print vtbl: 打印C++虛函數表
歷史值:
print命令打印的值被保存在value history中。爲了引用任何以前的值,使用$符號+value_history_編號
棧幀:
調用棧被分割爲連續的片,取名爲棧幀;每個幀都與一個函數調用聯繫。幀中保存函數參數,函數本地變量和正在哪個函數中執行的函數地址。
程序一旦啓動,首先只有一個main函數的幀,每次函數被調用,新的幀被創建,在函數返回時幀被移除。在程序內,使用地址標識幀,一個幀
由很多字節構成,每個字節都有自己的地址。GDB給每個存在的幀都賦一個數值,從0開始。
frame args: 允許從一個幀移動到另一個幀中。
select-frame:
Backtrace:
backtrace展示如何執行當前位置,一行代表一個幀,起始於當前執行的幀,接着是它的調用者,依次遞歸。
關於幀的信息:
frame: 打印當前選中幀的簡短描述
info frame :打印當前幀的詳細描述,包括:
幀的地址;
下一個幀的地址
上一個幀的地址
幀中的參數地址
本地變量在幀中的地址
程序計數器
幀中保存的寄存器
info locals
info args
info catch
info frame addr