1. 概述
“工欲善其事必先利其器”,本篇文章是“工具系列”的首篇,主要介紹gdb的基礎使用,如要深入了解,可以研究參考文獻1。
2. gdb是什麼
gdb是GNU開源組織釋出的一個強大的Unix/Linux下的程式調試工具,通過shell操作,可以實作各類IDE類似的調試功能。
3. 為什麼要使用gdb
程式猿的代碼總會有各種各樣的錯誤,這些錯誤基本可以分為兩類:
- 文法錯誤:編譯器會報錯,解決比較友善
- 邏輯錯誤:此時就需要調試代碼
雖然我們有各種各樣的IDE,但是對于從事 Linux C/C++ 開發的程式猿來說,大多數都需要熟悉gdb調試工具。尤其當不具備IDE的環境時(嵌入式系統等資源限制的場景),gdb以其占用資源少、開源免費和友善實用的優勢被廣泛使用,當然有IDE的話還是就根據個人習慣來吧。
gdb主要有以下的作用:
- 啟動程式,程式猿可以自定義地運作程式
- 讓被調試的程式在指定的斷點處停住,便于分析
- 當程式被停住時,可以檢查此時程式中所發生的事
- 動态地改變程式的執行環境
4. 怎麼使用gdb
下面結合執行個體給出gdb的簡單使用,給出mian.cpp檔案如下:
#include <iostream>
int add(int a , int b)
{
return a + b;
}
int main()
{
int sum[5] {0, 0, 0, 0, 0};
int arr1[5] {1, 2, 3, 4, 5};
int arr2[5] {1, 1, 1, 1, 1};
for(int i = 0; i < 5; ++i)
{
sum[i] = add(arr1[i], arr2[i]);
std::cout << sum[i] << " ";
}
std::cout << std::endl;
return 0;
}
4.1 進入gdb
使用g++ -g main.cpp -o main編譯程式,執行gdb main進入gdb,如下圖:
進入gdb.png
4.2 list
在gdb中使用(gdb) list(縮寫l)可以檢視代碼,可以使用list "linenum"或者list "function"檢視,如下圖:
list檢視代碼.png
4.3 break
在gdb中使用(gdb) break(縮寫b)指令來設定斷點,設定斷點的方法包括:
- break "function"
- break "linenum"
- break "filename":"linenum"
- break "filename":"function"
具體操作如下圖:
break打斷點.png
4.4 run
在gdb中使用(gdb) run(縮寫r)運作程式,程式在斷點之前就會停下來,斷點的那一行不運作,如下圖:
run運作程式.png
4.5 單步指令
在gdb中使用(gdb) next(縮寫n)/step(縮寫s)進行單步調試。其中:
- next :類似于step over,不會進入函數的内部
- step:類似于step into,會進入函數的内部
具體的操作如下圖:
next/step單步調試.png
4.6 continue
在gdb中使用(gdb) continue(縮寫c,fg指令同continue指令)可以恢複程式的運作直到程式結束或到達下一個斷點,如下圖:
continue指令.png
4.7 print
在gdb中使用(gdb) print(縮寫c)檢視目前程式的運作資料,如下圖:
print檢視資料.png
4.8 watch
在gdb中使用(gdb) watch來觀察某個表達式的值是否有變化了,若有變化,馬上停住程式,如下圖:
watch觀察表達式變化.png
4.9 quit
在gdb中使用(gdb) quit來退出gdb調試模式,如下圖:
quit退出gdb.png
5. 總結
本文給出了gdb的簡單操作,可以看到和常見IDE的調試操作是類似的,其實IDE不過隻是做了個圖形界面,底層調用的還是類似于gdb這樣的工具。在實際的代碼調試工作中,通過将以上的指令組合使用可以達到我們的目的。
作者雖然有着“多年的”編(copy)碼(paste)經驗,但是基本都在使用IDE調試,文中難免有不當之處,還請批評指出,謝謝!
6. 參考文獻
- http://www.gnu.org/software/gdb/
- Linux gdb調試器用法全面解析, https://www.cnblogs.com/mingcaoyouxin/p/4225619.html
- linux 下 GDB調試器的使用(初學者), https://blog.csdn.net/qq_42543896/article/details/107094197
歡迎大家批評指正、評論和轉載(請注明源出處),謝謝!