GDB 除錯工具高階用法

2022-08-23 22:21:21 字數 2895 閱讀 5958

ulimit -c #檢視core檔案的生成開關,若為0則關閉

ulimit -c unlimited #開啟開關,只在當前shell生效

sudo sh -c 'echo "./%e.core.%p" > /proc/sys/kernel/core_pattern' #在當前目錄下生成core檔案,臨時生效

gdb ./process         #直接除錯目標程式

gdb ./process core  #除錯轉儲檔案

gdb #除錯服務程式

棧回溯顯示我們是如何到達失敗點的,通常足夠幫助我們確定常見的問題。

bt (backtrace的簡寫)常常是我在 gdb 中使用的第一條命令

gdb$ bt     #棧回溯,有core檔案的情況下

disas main #反彙編main函式,或者其它出錯函式

i r     #(info registers 的簡寫)列印暫存器值

start    #開始除錯,在main函式的第一條語句停下來 ; 等同於 break main

break 是設定斷點,可簡寫為b

b n  #在第n行原始碼處設定斷點

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

b func  #在func()函式入口點設定斷點

delete 斷點號n  #刪除第n個斷點

disable 斷點號n  #暫停第n個斷點

enable 斷點號n  #開啟第n個斷點

clear 行號n  #清除第n行的斷點

info b   #(info breakpoints)顯示當前程式的斷點設定情況

delete breakpoints  #清除所有斷點

r  #執行此程式

c  #繼續執行

next  #單步步過

step  #單步步入

until

#一直執行程式,直到退出迴圈體

until+行號  #執行至某行,不僅僅用來跳出迴圈

finish  #執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊

call 函式(引數)  #呼叫程式中可見的函式,並傳遞「引數」,如:call gdb_test(55)

q  #退出

print 表示式:簡記為 p ,其中「表示式」可以是任何當前正在被測試程式的有效表示式

比如當前正在除錯c語言的程式,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫

print a    #將顯示整數 a 的值

print name  #將顯示字串 name 的值

p main    #列印main函式內容和位址

p buffer    #列印buffer內容

p &buffer    #列印buffer位址

info f  #這句也可以查到main函式位址,最後一行

gdb 有乙個超棒的功能叫回退

reverse-stepi    #回退一條指令

x 是 examine 的縮寫

n 表示要顯示的記憶體單元的個數

f 表示顯示方式, 可取如下值

x 按十六進製制格式顯示變數。

d 按十進位制格式顯示變數。

u 按十進位制格式顯示無符號整型。

o 按八進位制格式顯示變數。

t 按二進位制格式顯示變數。

a 按十六進製制格式顯示變數。

i 指令位址格式

c 按字元格式顯示變數。

f 按浮點數格式顯示變數。

u 表示乙個位址單元的長度

b 表示單位元組

h 表示雙位元組

w 表示四位元組

g 表示八字節

format letters are

o(octal), x(hex), d(decimal), u(unsigneddecimal)

t(binary), f(float), a(address), i(instruction), c(char) ands(string)

size letters are

b(byte), h(halfword), w(word), g(giant, 8bytes)

x/3uh buf
表示從記憶體位址buf讀取內容

h 表示以雙位元組為乙個單位

3表示三個單位

u 表示按十六進製制顯示

(gdb) list

#include

intmain()

(gdb)

break

10breakpoint

1 at 0x8048372: file test.c, line 10

.(gdb) run

starting program:/data/compiler/g_platform/bradenwu/md5/test.out

breakpoint

1, main () at test.c:10

10return0;

(gdb) x/8xb md5

0x8837f465: cannot access memory at address 0x8837f465

(gdb) x/8xb &md5

0xbfffefa0: 0x65

0xf4

0x37

0x88

0x2e

0x4f

0x0b

0xc4

linux除錯工具gdb用法

1 編譯選項 1.1 gcc g 名 g 付 行 gdb 可能 為 情報 増 生成 実行 大 2.除錯命令 2.1.gdb programname 2.2.gdb args programnmae arg1 arg2 2.3.gdb b n n 行數 break point 設定 gdb b 関數名...

除錯工具 gdb

gcc o a.out a.c gdb q a.out break main info register i r objdump d a.out grep a20 main.轉換為機器 objdump m intel d a.out grep a20 main.gdb 設定 1 gdb q 2 se...

gdb除錯工具

檢視幫助一是man 命令,二是進入 www.gnu.org 找到gdb的幫助文件 更詳細 gcc wall g main.c o main,只有這樣才能產生除錯資訊,包括core的除錯資訊。一 常用命令 run r 執行,執行到斷點,重新用r,表示重新開始執行。list l 列出源 l 2,l ma...