GDB 簡介
GDB 是什麼
GDB 是 linux 環境下的一般功能強大的偵錯程式,用來除錯 C 或 C++ 寫的程式。它可以做這些事情
- Start your program, specifying anything that might affect its behavior.
- Make your program stop on specified conditions.
- Examine what has happened, when your program has stopped.
- Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
安裝
以 centos 7 為例,安裝 GDB-8.2.1 版本
安裝依賴
C++ 11 編譯器和 GUN make 是 GDB 必要的工具包,需先安裝他們。
yum install gcc* -- 或者為了省事,直接把開發常用的工具包都安裝了 yum group install "Development Tools" -- 檢視是否安裝成功 gcc -v # 需 4.8 以上版本
gun make 官網地址
安裝 GDB
在 官網 上找到官方的 FTP 倉庫,下載最新的版本,解壓後開始安裝
./configure --prefix=/usr/local/gdb821 make && make install 安裝完成將 /usr/local/gdb821/bin 新增到 PATH 環境變數 -- 也可以直接用 yum 安裝 yum install -y gdb
安裝需要花比較久時間,可以洗個澡乾點愛乾的事。
gdb -v
使用示例
一個簡單的示例,執行一個 PHP 指令碼 gdb_test.php
<?php for($i = 0; $i < 10; $i++){ if(in_array($i,[1,9,20])){ echo $i*$i,PHP_EOL; } }
開始除錯
gdb php > run /usr/local/src/gdb_test.php
這樣指令碼就執行成功了,實驗了第一個命令。
後續再詳細學習斷點,單步除錯等真正的實驗。
附:GDB 常用命令
- backtrace:顯示棧資訊。簡寫為bt。
- frame x 切換到第x幀。其中x會在bt命令中顯示,從0開始。0表示棧頂。簡寫為f。
- up/down x 往棧頂/棧底移動x幀。當不輸入x時,預設為1。
- print x列印x的資訊,x可以是變數,也可以是物件或者陣列。簡寫為p。
- print */&x 列印x的內容/地址。
- call 呼叫函式。注意此命令需要一個正在執行的程式。
- set substitute-path from_path to_path,替換原始碼檔案路徑。當編譯機與執行程式的機器程式碼路徑不同時,需要使用該指令替換程式碼路徑,否則你無法在gdb中看到原始碼。
- break x.cpp:n 在x.cpp的第n行設定斷點,然後gdb會給出斷點編號m。命令可簡寫為b。後面會對break命令進行更詳細的解釋。
- continue 繼續執行程式。進入除錯模式後,若你已經獲取了你需要的資訊或者需要程式繼續執行時使用。可簡寫為c
- until 執行到當前迴圈完成。可簡寫為u
- step 單步除錯,步入當前函式。可簡寫為s
- next 單步除錯,步過當前函式。可簡寫為n
- finish 執行到當前函式返回
- set var x=10 改變當前變數x的值。也可以這樣用:set {int}0x83040 = 10把記憶體地址0x83040的值強制轉換為int並賦值為10
- info locals 列印當前棧幀的本地變數
- jump使當前執行的程式跳轉到某一行,或者跳轉到某個地址。由於只會使程式跳轉而不會改變棧值,因此若跳出函式到另外的地方 會導致return出錯。另外,熟悉彙編的人都知道,程式執行時,有一個暫存器用於儲存當前程式碼所在的記憶體地址。所以,jump命令也就是改變了這個暫存器中的值。於是,你可以使用“set $pc”來更改跳轉執行的地址。如: set $pc = 0x485
- return: 強制函式返回。可以指定返回值