run/r 運作
運作帶參數的可執行檔案:r 後面接參數,例如:
$ gdb executablefile
(gdb) r arg1 arg2 arg3
continue/c 繼續運作
next/n 單步運作
step/s 如果有函數則進入函數執行
finish 跳出目前的函數
jump/j 跳轉到指定行/位址後繼續執行,是以如果在跳轉的目标行上如果沒有設定斷點,會繼續往下執行
stop 停止運作
until xxx 可用于跳出循環
quit/ctrl+d 退出GDB
print/p var 列印變量的值
print/p &var 列印變量位址
printf/p *addr 列印位址的值
printf/p /x var 用16進制顯示資料
x/(n,f,u為可選參數) 檢視記憶體内容,與print不同的是,x後面接記憶體位址。
n: 需要顯示的記憶體單元個數,也就是從目前位址向後顯示幾個記憶體單元的内容,一個記憶體單元的大小由後面的u定義
f:顯示格式
x(hex) 按十六進制格式顯示變量。
d(decimal) 按十進制格式顯示變量。
u(unsigned decimal) 按十進制格式顯示無符号整型。
o(octal) 按八進制格式顯示變量。
t(binary) 按二進制格式顯示變量。
a(address) 按十六進制格式顯示變量。
c(char) 按字元格式顯示變量。
f(float) 按浮點數格式顯示變量
u:每個單元的大小,按位元組數來計算。預設是4 bytes。GDB會從指定記憶體位址開始讀取指定位元組,并把其當作一個值取出來,并使用格式f來顯示
b:1 byte h:2 bytes w:4 bytes g:8 bytes
比如x/10xw 0x54320(4位元組顯示機關等同于x/10x 0x54320)表示從記憶體位址0x54320讀取内容,w表示以4位元組為機關,10表示輸出10個記憶體機關,x表示按照十六進制顯示。
x/50x $rsp 列印堆棧前50個記憶體單元的内容,每個單元預設占用4個位元組
break/b xxx 在某行打斷點
break/b fun 在某個函數處加斷點
b xxx if (condition)條件斷點,
例如:
b test.c:30 if n==100 //當變量n等于100的時候在test.c的30行處加斷點.
b test_function if $_streq(my_arg1,"test1") //當字元串參數my_arg1等于"test1"的時候加斷點
$_streq是gdb内置函數,具體參見參考文獻。
break fileName:N 在某個檔案的N行加斷點
break fileName:func 在某個檔案的某個函數加斷點
info break/b [n] 檢視斷點,(注:n表示斷點号,可選。info b列出所有斷點資訊)
clear N 删除N行斷點
delete N 删除N号斷點
delete 删除所有斷點
disable xxx 失能斷點
enable xxx 使能斷點
info b 檢視斷點
info source 檢視目前程式
info args 列印出目前函數的參數值。
info locals 列印出目前函數中所有局部變量值。
info registers/r 檢視所有寄存器的值
info registers/r後面接寄存器名 檢視某個寄存器的值
例如:
(gdb) info r rbp
rbp 0x7ff064d078c0 0x7ff064d078c0
info threads 檢視線程
thread apply all bt 檢視所有線程back trace
thread 檢視目前thread
例如:
(gdb) thread
[Current thread is 7 (Thread 1572)]
info line *0xxxxx 檢視位址對應的function,類似于addr2line
例如:
(gdb) info line *0x40ac8810
Line 66 of "../../../../../../my_test.cpp" starts at address 0x40ac8810 <test_port(void*)+352> and ends at 0x40ac8819 <test_port(void*)+361>.
bt 檢視函數back trace
pwd檢視程式路徑
ctrl+p 前一條指令
ctrl+n 下一條指令
watch xxx 設定監控點,在變量改變的時候停下來。(不可直接設定,先加斷點在監測)
ctrl+l可能layout會造成控制台花屏,使用ctrl+L清屏
list linenum:以linenum指定的行号為中心,顯示10行
list function:以指定的函數為中心,顯示10行
list:重複上一次的list指令,也可以直接按Enter鍵,重複上次指令。
set listsize count:設定每次顯示的行數。
show listsize:顯示已設定的顯示行數。
list first,last:顯示指定起始行到結束結束行的源檔案。
list ,last:顯示以指定的last為結束行,顯示10行。
list first,:以first為第一行,顯示10行。
list +:以上次顯示的結束行為起始行顯示後10行
list –:以上次顯示的起始行為結束行,顯示前10行
多線程下(禁止|允許|單步調試時禁止)線程切換:
set scheduler-locking on|off|step
show scheduler-locking: 檢視gdb線程工作模式,預設為step, 即在調試的時候可以暫停其他線程的執行,以免線程混亂或者其他線程逾時。
set scheduler-locking mode: 設定gdb工作模式,具體參考:
https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html
set variable variable = [expression] 設定變量的值,可以縮寫為 set var ......
Parameters
variable
The variable to set.
If variable starts with a dollar sign ($) then it is either a predefined register name or a debugger variable, either a predefined variable or a user variable.
If variable does not start with a dollar sign ($), it is a variable in the program.
expression
The value for the variable.
例子:
(gdb)
print node->_data
2
(gdb)
set variable node->_data = 5
(gdb)
print node->_data
5
===========================================================
layout顯示源碼:
(gdb) layout src:顯示源碼視窗
(gdb) layout asm:顯示彙編視窗
(gdb) layout regs:顯示寄存器視窗
(gdb) layout split:顯示源碼和彙編視窗
(gdb) layout next:顯示下一個layout視窗
(gdb) layout prev:顯示上一個layout視窗
Ctrl + L:重新整理視窗
Ctrl + x,再按1:單視窗模式
Ctrl + x,再按2:雙視窗模式
Ctrl + x,再按a:退出layout,回到執行layout之前的調試視窗。
===========================================================
調試core dump:
gdb <executable_binary> <coredump_file>
其中可執行檔案為帶有符号表的binary. 進入gdb以後執行bt指令檢視函數調用。
===========================================================
常見問題:
1. print變量的時候出現<value optimized out>
gdb調試程式的時候列印變量值會出現<value optimized out> 情況,可以在gcc編譯的時候加上 -O0參數項,意思是不進行編譯優,釋出項目的時候不要使用 -O0參數項,gcc 預設編譯或加上-O2優化編譯會提高程式運作速度.
參考文獻:
https://blog.csdn.net/u014015972/article/details/51620694
http://scc.ustc.edu.cn/zlsc/chinagrid/intel/debugger/cl/GUID-BD46F547-7EFA-4066-96BB-7CB9EF415140.htm
https://sourceware.org/gdb/onlinedocs/gdb/All_002dStop-Mode.html
https://sourceware.org/gdb/onlinedocs/gdb/Non_002dStop-Mode.html
https://www-zeuthen.desy.de/unix/unixguide/infohtml/gdb/All_002dStop-Mode.html
https://sourceware.org/gdb/onlinedocs/gdb/Convenience-Funs.html