gdb工具的使用

2021-10-24 01:53:20 字數 3375 閱讀 8140

info registers

info all-registers

(下面這兩個暫時不知道如何使用)

info registers reggroup …

info registers regname …

four standard register name:pc sp fp ps

p/x $pc

x/i $pc

set $sp += 4

2、gdb除錯基本命令

(gdb) start : 執行程式

(gdb) continue : 從斷點位置繼續執行

(gdb) r(un) : 執行準備除錯的程式,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(《和》)和shell萬用字元(*、?、[、])在內。

(gdb) n(ext) : 單步執行,逐過程除錯,c style

(gdb) s(tep) : 單步執行,逐語句除錯,c style

(gdb) n(ext)i : 單步執行,逐過程除錯, asm style

(gdb) s(tep)i : 單步執行,逐語句除錯, asm style

finish : 如果已經進入了某函式,而想退出該函式返回到它的呼叫函式中,可使用命令finish

until : 結束當前迴圈

whatis : 顯示變數或函式型別

quit : 退出gdb

3、布局和顯示資料

display /i $pc :命令可以在除錯時顯示每條彙編命令。

info win :顯示視窗的大小

layout next :切換到下乙個布局模式

layout prev :切換到上乙個布局模式

layout src :只顯示源**,退出方法為ctrl+x+a

layout asm :只顯示彙編**

layout split :顯示源**和彙編**

layout regs :增加暫存器內容顯示

focus cmd/src/asm/regs/next/prev :切換當前視窗

refresh /ctrl+l :重新整理所有視窗

tui reg next :顯示下一組暫存器

tui reg system :顯示系統暫存器

update :更新源**視窗和當前執行點

print bb :列印變數

print $bb :列印暫存器

print gdb_test(22):將以整數22作為引數呼叫 gdb_test() 函式

print gdb_test(a):將以變數 a 作為引數呼叫 gdb_test() 函式

display 表示式:在單步執行時將非常有用,使用display命令設定乙個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如: display a

watch 表示式:設定乙個監視點,一旦被監視的「表示式」的值改變,gdb將強行終止正在被除錯的程式。如: watch a

//檢視源**

list(l) :檢視當前**附近的**行

list :簡記為 l ,其作用就是列出程式的源**,預設每次顯示10行。

list 行號:將顯示當前檔案以「行號」為中心的前後10行**,如:list 12

list 函式名:將顯示「函式名」所在函式的源**,如:list main

list :不帶引數,將接著上一次 list 命令的,輸出下邊的內容。

4、查詢執行資訊

where/bt :當前執行的堆疊列表

bt /backtrace/info stack :顯示當前呼叫堆疊

bt full :檢視完整的呼叫堆疊資訊,包括每個棧幀中所有變數和引數的資訊。

up/down :改變堆疊顯示的深度

set args :指定執行時的引數

set args [arguments] :傳遞命令列引數

show args :檢視設定好的引數

info program :檢視程式的是否在執行,程序號,被暫停的原因。

5、設定斷點和清除斷點

break :在進入指定函式時停住。c++中可以使用class::function或function(type,type)格式來指定函式名。

break :在指定行號停住。

break +offset / break -offset :在當前行號的前面或後面的offset行停住。offiset為自然數。

break filename:linenum :在原始檔filename的linenum行處停住。

break filename:function :在原始檔filename的function函式的入口處停住。

break *address :在程式執行的記憶體位址處停住。

break :break命令沒有引數時,表示在下一條指令處停住。

break … if < condition > …可以是上述的引數,condition表示條件,在條件成立時停住。比如在迴圈體中,可以設定break if i==100,表示當i為100時停住程式。

b fn1 if a>b :條件斷點設定

info break [n] :顯示當前gdb的斷點資訊

delete [n] :清除指定斷點

disable breakpoint [n] :禁止指定斷點

enable breakpoint [n] :允許指定斷點

以十進位制的方式檢視暫存器的值:

p/d $pc

1參考**:

6、示例

gdb ./demo

(gdb) set args -i input.svac2

(gdb) start

(gdb) b 1201

(gdb) info b

(gdb) c

(gdb) step

(gdb) finish

(gdb) layout src

(gdb) list

(gdb) print a

(gdb) print $r0

(gdb) q

注意: 想要使用gdb除錯程式,在使用gcc編譯程式時需要加上 -g 選項 。

一般除錯崩潰程式時,是利用gdb+core dump檔案進行除錯分析的。 設定ulimit -c unlimited,之後執行程式,等生成core dump, 最後gdb core_file 進行除錯分析,bt檢視crash之後的呼叫棧,定位到crash在了哪個位置。關於core dump分析,更多可參考:

linux中core dump分析

關於segmentation fault (core dumped)幾個簡單問題

另外,針對segment fault的錯誤,可以採用linux下strace工具進行診斷。使用strace execfile,執行程式,出錯時會顯示哪個系統呼叫出錯了。詳細可以參看:linux下系統呼叫除錯分析工具:strace。

gdb工具的使用

gdb是乙個互動式的除錯工具,在linux系統中可以很好地幫助我們完成程式的除錯。它的主要功能有 1.設定斷點,讓程式直接執行至可能出錯的地方 2.檢視變數的值,在除錯過程中隨時檢視我們關注的變數的值。3.修改變數的值,這是vs的偵錯程式所不具有的功能,可以幫助我們更快的定位程式的問題所在。那麼gd...

gdb工具使用

gdb是乙個由gnu開源組織發布的 unix linux作業系統下的 基於命令列的 功能強大的程式除錯工具。對於一名linux下工作的c 程式設計師,gdb是必不可少的工具。以下程式為例 include include int add sum int a,int b int main int arg...

(四)GDB工具的使用

寫乙個.c或者.cpp程式都可以用gdb工具來除錯。在linux環境下,用gcc來編譯鏈結,可以用makefile指令碼來做管理,makefile指令碼網上有許多資料,就不專門寫部落格來記錄了。一 準備好原始檔 這裡使用helloworld helloworld.c檔案內容如下 int main r...