gdb除錯技術

2021-10-03 16:59:14 字數 2899 閱讀 6556

1使用gdb除錯

除錯程式

當程式出現執行錯誤(bug)時,我們需要除錯程 序,將錯誤找出並解決(debug)

參考:《單步除錯》(vc下面的除錯程式的方法)

除錯手段分為兩種:

(1)單步除錯:使用偵錯程式,結合斷點,觀察變 量和記憶體的值。

(2)列印除錯: 將關鍵資訊用printf等函式輸出分析

gdb除錯

在linux使用gdb命令列進行單步除錯

準備工作:在compile這一步,新增選項‐g

g++ ‐g main.cpp ‐o helloworld

或%.o: %.cpp

[tab]g++ ‐c ‐g‐mmd $< ‐o $@

控制類命令

進入gdb介面後,使用命令來操縱除錯過程。gdb ./helloworld 進入gdb介面

b (break) : 新增斷點

r (run): 重頭開始執行程式

n (next): 下一步

c (continue): 程式繼續執行,直到下一處斷點, 或者程式執行結束

q (quit): 退出程式介面

(注:可以輸入全稱break,也可以只輸入b)

新增斷點:

b main (加上函式名)

b main.cpp:12 (檔名+行號)

b 12 (當前檔案的行號)

b object::create (類名+ 成員函式)

顯示斷點info break

刪除斷點del break 2 (後面的2是編號)

next 執行下一步

n 執行下一步

n 3 執行下面三步

顯示變數/記憶體

p (print) 顯示表示式的值

p ap a+b

p (object*)p1‐>a

更特殊的用法,像函式一樣呼叫顯示

p ("%d", 『a』)

顯示變數/記憶體

disp (display) 監視變數(每執行一步都顯示),相當於vc下的watch

x 顯示記憶體的值

x/16xb buf

其中,16: 顯示16個單位

x: 以十六進製制顯示(x d u f s …)

b: 單位是1位元組(可選b h w g )

byte, half‐word, word, giant

檢視幫助

help x

help info

可以檢視某個子命令的幫助

小結:

1,gdb除錯準備

2,控制類命令

3,檢視類命令

2段錯誤與記憶體轉儲

段錯誤segment fault

在linux下,程式中如果進行了不正確的指標操作, 則程式崩潰、提示"segment fault"

如,空指標訪問,野指標訪問,陣列越界訪問。。。

int* p = null;

*p = 1;

安全的使用指標

錯誤提示(段錯誤,core dumped)

段錯誤的定位

一、如果此錯誤容易復現,則使用gdb

gdb helloworld

會在發生段錯誤的地方提示

program received signal sigse**, segmentation fault.

0x0804844a in test (p=0x0) at main.cpp:5

5 *p = 12; 此時程式已經異常終止

bt (backtrace) 檢視錯誤時刻的棧資訊

記憶體轉儲

二、此錯誤不容易復現

程式長年累月地執行,不知何時發生了段錯 誤,程式異常關閉。

可以使用「記憶體轉儲」手段,來復原檢視段 錯誤發生的位置。

記憶體轉儲

在執行該程式的shell(終端)裡執行命令

ulimit ‐c unlimited

(注:在shell關閉重啟後,要重新執行一次)

執行程式

程式發生段錯誤時,程式退出,同時當發生錯誤 時的資訊轉儲(dump)到乙個core.*檔案。

用gdb來檢視發生段錯誤的**位置

gdb helloworld core.***

小結:

1,段錯誤

2,記憶體轉儲

3gdb除錯的補充說明

內容提要

(1)什麼樣的程式是可除錯的?

(2)什麼場合下適合用gdb除錯?什麼場合不適 合?

程式中的除錯資訊

當程式編譯時帶‐g選項時,程式才可以被除錯

實際上,當以‐g選項編譯時,編譯器將「除錯資訊」加在了目標程式裡,因此,目標程式的體積將顯著 變大。

比較輸出的目標程式的體積:

g++ ‐g main.cpp ‐o helloworld

g++ main.cpp ‐o helloworld

除錯資訊記錄了哪些東西?

‐至少記錄了原始檔和行號資訊

gdb的使用場合

適用的場合:

‐ 單元測試(較短的**,功能單純的函式)

‐ 段錯誤的定位

不太適用的場合:

‐ 大型程式,

-尤其是程式中使用了多執行緒

‐ 單步除錯的時候問題無法復現,只能在正常運 行的時候復現

(我們使用列印除錯)

小結:

1,gdb除錯的原理

2,gdb與列印除錯的場合

學習資源《c語言/c++學習指南》linux開發篇

GDB除錯技術

gnu的偵錯程式稱為gdb,該程式是乙個互動式工具,工作在字元模式。在 x window 系統中,有乙個gdb的前端圖形工具,稱為xxgdb。gdb 是功能強大的除錯程式,可完成如下的除錯任務 設定斷點 監視程式變數的值 程式的單步執行 修改變數的值。在可以使用 gdb 除錯程式之前,必須使用 g ...

GDB除錯常用技術

linux可以通過如下命令開啟core dump功能 ulimit c unlimited sudo sh c echo tmp core.t proc sys kernel core pattern 開啟core dump之後,程序崩潰時會產生一系列 tmp core 的檔案 android中應用...

Linux的GDB除錯技術

hchen test 補充gdb除錯中動態顯示執行的 在gdb除錯中,大家都知道使用list命令來顯示 例如 顯示main.c中的main函式附近的 list main.c main 顯示main函式附近的 list main 顯示main.c中的第2到20行的 list main.c 2,20 顯...