天天看點

gdb 常用指令

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

繼續閱讀