要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下:
此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 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 ...