gdb 跟蹤除錯

2021-07-24 02:32:36 字數 1975 閱讀 9884

要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下:

此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤

執行 gdb

gdb 啟動常用的引數

從指定檔案中讀取符號表資訊,並把他用在可執行檔案中

除錯時 core dump 的 core 檔案

加入乙個原始檔的搜尋路徑.預設搜尋路徑是環境變數中 path 所定義的路徑

設定啟動時候引數

gdb 幫助文件

gdb 中執行 unix 的 shell 程式

歷史記錄

啟動程式

gdb 設定

陣列元素單獨行顯示

顯示陣列元素顯示

設定字串顯示

設定結構體變數顯示

設定字元顯示

設定聯合體顯示

設定物件顯示

設定靜態成員顯示

設定虛函式表顯示

設定執行程式的相關環境及其引數

執行引數

執行環境

工作目錄

程式的輸入輸出

堆疊幀設定

除錯模式

顯示源**

設定和獲得顯示原始碼的行數

搜尋源**

源**的記憶體

檢視彙編**

斷點(breakpoint)

檢視斷點

觀察點(watchpoint) -- 觀察點一般來觀察某個表示式(變數也是一種表示式)的值是否有變化了,如果有變化,馬上停住程式.

檢視觀察點

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

《/p>

tcatch -- 只設定一次捕捉點,當程式停住以後,應點被自動刪除.

維護停止點

刪除停止點

禁用停止點

啟用停止點

停止條件維護 -- 以用 condition 命令來修改斷點的條件.(只有break和watch命令支援if,catch目前暫不支援if)

忽略停止點 n 次

為停止點設定執行命令

新增訊號處理

檢視處理訊號

恢復執行

單步除錯

跟蹤機器指令

與之一樣有相同功能的命令是 「display/i $pc」 ,當執行完這個命令後,單步跟蹤會在打出程式**的同時打出機器指令(也就是彙編**)

函式除錯

迴圈體除錯

修改變數值

跳轉執行

產生訊號量

檢視執行時資料

是輸出的格式

注意:

printf "fmt",arg,... -- 列印格式化字元燦 fmt.

檢視記憶體

u 表示從當前位址往後請求的位元組數,如果不指定的話,gdb預設是 4 個 bytes.

表示乙個記憶體位址.

自動顯示

刪除自動顯示

啟用和禁自動顯示

檢視棧資訊

frame -- 會列印出這些資訊:棧的層編號,當前的函式名,函式引數值,函式所在檔案及行號,函式執行到的語句.

info frame -- 這個命令會列印出更為詳細的當前棧層的資訊,只不過,大多數都是執行時的內內位址.

info args -- 列印出當前函式的引數名及其值.

info locals -- 列印出當前函式中所有區域性變數及其值.

info catch -- 列印出當前的函式中的異常處理資訊.

切換函式棧位置

檢視暫存器

執行緒檢視與切換執行緒

定義乙個命令

定義乙個命令的文件資訊(在 help cmdname 的時候顯示)

檢視自定命令

gdb 跟蹤除錯命令整理

內容源自於陳浩csdn部落格的用gdb除錯程式一系列文章 要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下 此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤 執行 gdb...

GDB除錯之watch變數跟蹤

開發中經常遇到某個變數明明已經賦值了,但是最後得到的結果卻並非賦予的值。解決這樣問題讓人很頭疼,原因我們可能都知道,可能是記憶體越界導致這部分值被覆蓋掉了,但是什麼時候被覆蓋掉的呢?總不能在每個懷疑的地方列印這個值吧?這樣效率很低,而且定位不一定準確。這個時候使用gdb除錯中的watch就可以輕鬆搞...

Linux下使用gdb除錯跟蹤程序

可以使用gdb strace命令 推薦gdb 本文主要介紹使用gdb在linux下直接對程序進行跟蹤除錯 若想使用gdb對程序除錯,需要在編譯程式時加入相關的選項 set cmake build type debug set cmake cxx flags debug env o0 wall g2 ...