C 語言程式設計 GDB 除錯工具

2021-10-04 18:27:46 字數 3935 閱讀 9978

列印資訊

查詢執行資訊

分割視窗

《程式編譯流程與 gcc 編譯器》

《c 語言程式設計 — 基本語法》

《c 語言程式設計 — 基本資料型別》

《c 語言程式設計 — 變數與常量》

《c 語言程式設計 — 運算子》

《c 語言程式設計 — 邏輯控制語句》

《c 語言程式設計 — 函式》

《c 語言程式設計 — 高階資料型別 — 指標》

《c 語言程式設計 — 高階資料型別 — 陣列》

《c 語言程式設計 — 高階資料型別 — 字串》

《c 語言程式設計 — 高階資料型別 — 列舉》

《c 語言程式設計 — 高階資料型別 — 結構體與位域》

《c 語言程式設計 — 高階資料型別 — 共用體》

《c 語言程式設計 — 高階資料型別 — void 型別》

《c 語言程式設計 — 資料型別的別名》

《c 語言程式設計 — 資料型別轉換》

《c 語言程式設計 — 巨集定義與預處理器指令》

《c 語言程式設計 — 異常處理》

《c 語言程式設計 — 標頭檔案》

《c 語言程式設計 — 輸入/輸出與檔案操作》

《c 語言程式設計 — 堆疊與記憶體管理》

《c 語言程式設計 — 指令行引數》

gdb(gnu debugger)包含在 gnu 的 gcc 開發套件中,是基於命令列的、功能強大的程式除錯工具。對於一名 linux 平台下工作的 c/c++ 程式設計師,gdb 是必不可少的工具。

安裝

yum install gdb -y
gdb 主要能夠幫忙我們完成下面四個方面的功能:

可以按照自定義的要求執行程式。

支援基於條件表示式的斷點。

當程式被停住時,可以檢查此時程式中所發生的事情。

動態的修改程式的執行環境。

程式的除錯過程主要有:單步執行,跳入函式,跳出函式,設定斷點,設定觀察點,檢視變數。

簡單示例

$gdb programmer     # 啟動 gdb

>break main # 設定斷點

>run # 執行除錯程式

>next # 單步除錯

>print var1 # 列印變數值

>list # 顯示當前除錯處的源**

>info b # 顯示當前斷點設定情況

對 c/c++ 程式的除錯,需要在編譯前就加上 -g 選項。-g 選項的作用是在可執行檔案中加入原始檔資訊,所以在除錯時必須保證 gdb 能找到原始檔。不使用 -g 的話將看不見程式的函式名和變數名,代替它們的全是執行時的記憶體位址。

$ gcc -g main.c -o main
$ gdb main

gnu gdb (gdb) red hat enterprise linux 7.6.1-115.el7

license gplv3+: gnu gpl version 3 or later this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law. type "show copying"

and "show warranty" for details.

this gdb was configured as "x86_64-redhat-linux-gnu".

for bug reporting instructions, please see:

...reading symbols from /root/main...done.

(gdb)

note:如果沒有加 -g 進行編譯的話,會出現錯誤。意思是沒能從可執行檔案中獲得符號表(symbol table)資訊,你可以使用 -se file 指令,從指定檔案中讀取符號表資訊,並把它用在可執行檔案中。

no symbol table is loaded.  use the "file" command.
$ gdb
啟動了 gdb 後,就進入到指令行的互動模式,可以通過以下指令完成對程式的除錯。

速查表:

start                         // 開始除錯

n // 一條一條執行

step/s // 執行下一條,如果函式進入函式

backtrace/bt // 檢視函式呼叫棧幀

info/i locals // 檢視當前棧幀區域性變數

frame/f // 選擇棧幀,再檢視區域性變數

print/p // 列印變數的值

finish // 執行到當前函式返回

set var sum=0 // 修改變數值

list/l 行號或函式名 // 列出原始碼

display/undisplay sum // 每次停下顯示變數的值/取消跟蹤

break/b 行號或函式名 // 設定斷點

continue/c // 連續執行

info/i breakpoints // 檢視已經設定的斷點

delete breakpoints 2 // 刪除某個斷點

disable/enable breakpoints 3 // 禁用/啟用某個斷點

break 9 if sum != 0 // 滿足條件才啟用斷點

run/r // 重新從程式開頭連續執行

watch input[4] // 設定觀察點

info/i watchpoints // 檢視設定的觀察點

x/7b input // 列印儲存器內容,b--每個位元組一組,7--7組

disassemble // 反彙編當前函式或指定函式

si // 一條指令一條指令除錯 而 s 是一行一行**

info registers // 顯示所有暫存器的當前值

x/20 $esp // 檢視記憶體中開始的20個數

在 gdb 中,程式有以下幾種暫停方式:

當已定義好的停止點沒有用時,可以使用 delete、clear、disable、enable 這幾個命令來進行維護。此外還有 ignore,可以指定程式執行時,忽略停止條件幾次。

觀察點通常用來觀察某個表示式的值是否變化了。如果有變化,馬上停住程式。

設定捕捉點來補捉程式執行時的一些事件,e.g. 載入共享庫(動態鏈結庫)或是 c++ 的異常。

event 列表:

除錯工具 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...

GDB除錯工具

mascot 射水魚 gdb官網 gdb適用的程式語言 ada c c objective c pascal 等。gdb的工作方式 本地除錯和遠端除錯。目前release的最新版本為8.0,gdb可以執行在linux 和windows 作業系統上。1.1 what is gdb?1 gdb gnud...