gdb的使用指南(上)

2021-08-03 06:26:55 字數 3776 閱讀 6113

本文將介紹gdb的最基本的使用方法,其中的難點——多執行緒除錯、堆疊資訊分析和core檔案分析將放在下一節來講述。

gcclinux系統、windows系統的cygwin下最常使用的c語言編譯器。

$ gcc -g 源**檔名
如果追加了-g編譯選項,會在最後生成的可執行檔案中嵌入一些用於捕捉和輸出程式當前程式執行狀態的**,它們可以幫助我們更好地除錯程式,但同時也增加了檔案大小、降低執行效率。

$ gdb 可執行檔名
注意:這樣只是指定了要除錯的物件檔案並啟動了gdb環境而已,而並沒有真正地開始執行程式。

(gdb) r
r就是run的省略。通過上面的命令,我們可以開始執行在啟動gdb環境時指定了的程式。如果想要傳輸啟動引數,直接在r後面加上引數1, 引數2, 引數3,……即可。

(gdb) q
q就是quit的縮略。

當程式執行到斷點時,會自動停止,此時可以輸出當前程式的相關資訊,幫助我們更好地除錯程式。

(gdb) b 行號

(gdb) b 函式名

(gdb) b 檔名:行號

b就是break的縮略。

①單步執行,如果當前是乙個函式呼叫語句,則直接執行下一條語句(不進入函式內部)。

(gdb) n
nnext的縮略。

②單步執行,如果當前是乙個函式呼叫語句,則進入該函式內部。

(gdb) s
sstep的縮略。

③繼續執行程式,會在遇到斷點後再次暫停執行。如果沒有遇到斷點,就會一直執行到結束。

(gdb) c
ccontinue的縮略。

(gdb) p 變數名

(gdb) p *指標名

(gdb) p &記憶體位址

pprint的縮略。

print命令可以在後面附加/format選項,用於指定輸出的格式。

語法格式含義o

8進製表示

x16進製表示

t2進製表示

f浮點數表示

d有符號10進製表示

u無符號10進製表示c字元

a記憶體位址

比如說,我們想以二進位制形式列印變數var當前的值,可以這麼做:

(gdb) p/t var
①檢視某個變數的型別

whatis 變數名

或者ptype 變數名

②檢視當前設定的所有斷點的資訊

info b
③檢視當前函式呼叫的堆疊資訊

info stack
④檢視當前的執行緒資訊

info thread
⑤檢視當前設定的所有觀察點的資訊

info watchpoints
關於觀察點的概念及其使用,可以檢視第11點的內容。

⑥顯示所有當前呼叫棧的所有變數

(gdb) info locals
①跳轉到指定行,再執行

jump
其中的可以是檔案的行號,可以是file:line格式,可以是+num這種偏移量格式。

②跳轉並執行指定記憶體位址的**

jump *記憶體位址
注意,jump命令不會改變當前的程式棧中的內容。

下面的程式對file.cpp檔案的function函式設定了乙個斷點(gdb會自動分配它乙個斷點編號=1),而且我們規定只有變數x的值為1時才執行中斷。

(gdb) break file.cpp:function

(gdb) condition 1 x==1

(gdb) run

如果我們想消除斷點的條件,可以這麼做:

(gdb) condition 1
上面的1是指定斷點編號為1的斷點。

如果我們想實現下面這樣的功能:「當變數i不等於0時執行中斷」,就需要用到觀察點這個功能了。

1.watch exp:當表示式exp的值有變化時,馬上停住程式;

2.rwatch v:當變數v的值被讀時,馬上停住程式;

3.awatch v:當變數v的值被讀或被寫時,馬上停住程式。

所以,對於「當變數i不等於0時執行中斷」這樣的需求,我們可以這麼做:

(gdb) break file.cpp:function

(gdb) run

(gdb) delete → break pointをすべて削除

(gdb) watch i==0 → i==0 以外の時にストップ

(gdb) c

(gdb) set var 變數名 = 值
甚至我們可以利用它來指定執行時引數。

(gdb) set args 10 20 30 40 50
上面的命令沒有var關鍵字,是因為args並不是程式本身宣告的變數。

雖然在某些情況下,設定程式本身的變數的值可以省去var關鍵字,但是為了保險起見還是建議不要省略var

熟悉彙編的人都知道,程式執行時,有乙個叫pc的暫存器用於儲存當前**所在的記憶體位址。於是,你可以使用set $pc來更改跳轉執行的位址。如:

set $pc = 0x485
$pc這樣帶$號的變數一般就是gdb為了除錯方便自己引入的變數,當然我們也可以定義自己的輔助變數。

(gdb) set $ymm="yang"    #定義輔助變數ymm

(gdb) whatis $ymm #檢視變數型別

type = char [5]

GDB除錯使用指南

下面是從無到有使用gdb的乙個過程 檢視程序 root c650 253 root ps a pid tty time cmd 583 ttys0 00 00 00 login 595 ttys0 00 00 00 sh 687 ttys0 00 00 00 sh 730 ttys0 00 33 5...

mysql使用指南(上)

有很多朋友雖然安裝好了 mysql 但卻不知如何使用它。在這篇文章中我們就從連線mysql 修改密碼 增加使用者等方面來學習一些mysql的常用命令。一 連線mysql。格式 mysql h主機位址 u使用者名稱 p使用者密碼 1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 ...

ALinq Dynamic 使用指南 慨述(上)

1.程式集與命名空間的引用 使用 alinq dynamic,你需要引用alinq.dynamic.dll alinq使用者 或者system.data.linq.dynamic.dll linq to sql使用者 在使用時,還需要引入alinq.dynamic命名空間。當然,使用前你還需要完成建...