gdb 檢視暫存器的值

2021-09-23 14:06:55 字數 3375 閱讀 4759

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 棧破壞 暫存器

優化的 在printf或其它glibc函式處core 沒有檢查返回值的函式呼叫異常導致的異常 優化的 的計算異常的中間過程分析 棧溢位導致的core 區域性變數越界導致棧異常的core 通常除錯的 基本上都是在未開啟優化的情況下,各個變數都可以直接檢視,因此造成很多人除錯時基本上不會看暫存器,但是對...

暫存器(通用暫存器)

因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...

暫存器,標誌暫存器

涉及硬體傳輸資料的,往往包含以下內容 1.資料傳輸引腳 資料放 2.控制引腳 怎麼控制 3.狀態引腳 結果如何 暫存器相當於cpu內部的儲存單元,可能是連續排列,相當於 c語言中的陣列。一 8個通用暫存器 16 bit accumulate axah alr0 count cxch clr1 dat...