GDB使用小記

2022-08-30 13:18:12 字數 2889 閱讀 5071

by francis_hao nov 7,2016

記錄gdb常用功能。

gdb可以讓你檢視乙個程式在執行時其內部發生了什麼,或者當乙個程式崩潰時發生了什麼(通過使用gdb檢視core dump檔案)

基礎

啟動gdb

gdb            僅啟動gdb,未引導程式檔案,可通過file program進行載入,也可以在啟動時新增-q選項,不輸出版本資訊

gdb program        啟動gdb並引導程式檔案

gdb program core    啟動gdb引導程式檔案和核心檔案(檢視core dump??)

gdb program 除錯pid為的已執行程序,注意,如果目錄下有與同名的檔案,則會先檢查此檔案。

list [file:]function

從當前程式停止的位置檢視程式原始碼,直接列印到螢幕上。

break (b)

break [location] [thread threadnum] [if condition]

location:

行號函式名

檔名:行號

檔名:函式號

*位址+偏移量

-偏移量

如果沒有指定location,則會在當前執行位址設定斷點

threadnum:可以從info threads中獲取

condition :條件,例如i==5,僅當i=5時break。

info (i)

info line        當前除錯位置的程式的位址

info locals        當前堆疊下的區域性變數

info macro xx        顯示巨集xx的值

info program        程式當前的執行狀態

info registers        列出整形暫存器和值

info set            顯示gdb所有的設定(內容較多)

info sharedlibrary    顯示載入的共享庫的狀態

info source        當前原始檔的資訊

info sources        程式裡的原始檔資訊

info stack        程式堆疊的回溯資訊(類似backtrace)

info target        當前被除錯檔案的一些資訊(可以看到elf各個段)

info threads        當前已知的執行緒資訊

info tracepoints    追蹤點的狀態(how to use)

info types        顯示所有定義的資料型別(例如你定義的uchar的實際型別)

info variables        所有全域性的和靜態的變數資訊

disable

失能斷點,後面可以加斷點號,若不加則全部失能

enable

使能斷點,後面可以加斷點號,若不加則全部使能

delete (d)

刪除斷點,後面可以加斷點號,若不加則全部刪除

run [arglist]

啟動程式,同時指定程式的引數

next (n)

單步執行,如果有函式,一步執行,不進入

step (s)

單步執行,如果有函式則進入,單步執行最小語句單位

continue (c)

繼續執行,遇到斷點或結束才停止

print i (p i)

列印變數i的值

有效的變數包括當前棧的區域性變數和全域性變數,

還有一種形式可以列印乙個連續記憶體的值,常用語陣列中,這種形式就是foo@num其中foo是乙個陣列中的元素(注意,不是指標),num是要顯示的個數。同時,print命令也支援x命令的fmt,但是省略了重複數和單位長度,因為num指出了重複數,而foo指示了資料型別,也就知道了單位長度

例如:p /u *name@10

其中name是乙個陣列

edit [file:]function

從當前程式停止的位置檢視程式原始碼,預設是行模式,可以輸入vi進入類似vi的模式

set print element 0

改變顯示字串的個數限制,從而顯示所有的字串

backtrace (bt)|where

檢視當前函式呼叫棧的所有資訊,後面可跟數字表示只列印棧頂n層的資訊

up用於bt後,跳到上一函式棧,以檢視上一函式棧的資訊

down

用於bt後,跳到下一函式棧,以檢視下一函式棧的資訊

finish

退出當前函式,可返**用它的上一層函式

q退出gdb除錯

disassemble

對當前函式對應的二進位制進行反彙編

thread

切換當前除錯的執行緒為指定id的執行緒

gdb -p

除錯指定id的程序,gdb可以除錯已經執行的程式。

或者在進入gdb之後輸入:attach

高階

examine (x)

x/fmt address

檢視記憶體

address是乙個要檢視的記憶體位址表示式,

fmt 是 重複數+格式+單位長度的組合。

單位長度有:b(一位元組byte),h(二位元組halfword),w(四位元組word),g(八字節giant)。

比如x/2xw,表示以十六進製制顯示兩個四位元組大小的記憶體資料

預設的格式和單位長度是上次使用的值,預設的重複數是1,預設的位址是接著上次使用該命令或print命令的位址。

gdb_tips :

用gdb除錯程式

gdb backtrace bt 檢視程式crash堆疊資訊

用gdb除錯程式—偵錯程式gdb常用功能

gdb的基本用法

gdb設定條件斷點

gdb 實用小記

將日常常用的gdb操作記下來,記憶力不好 1.gdb 除錯程式 gdb 程式檔案 2.gdb 除錯程序 gdb attach 程序pid 3.gdb 除錯core檔案 gdb core core檔案 也可以 gdb c core檔案 也可以 gdb xx.dbg 帶 g編譯後的可執行檔案 core檔...

gdb除錯學習小記

由於最近搞了一發sublime text的使用,然後發現這東西只能當編譯器,不能用來除錯 於是便去學了一發gdb的除錯方法。然後發現報錯了?仔細一看,原來是pascal的gdb把c 的gdb覆蓋掉了233 怎麼那麼相似呢 機房渣渣win7 32bit mingw file 檔名 開始除錯這個檔案 r...

GDB除錯core檔案小記

1.如果不走配置,必須在當前shell中設定core檔案的限制 2.在當前shell中設定core限制,在其他shell中啟動程式,是不會生效的 3.core一般很大,最好設為unlimited 4.root 使用者使用ulimit c unlimited命令,開啟core dump功能,並且不限制...