天天看點

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

1. 概述

“工欲善其事必先利其器”,本篇文章是“工具系列”的首篇,主要介紹gdb的基礎使用,如要深入了解,可以研究參考文獻1。

2. gdb是什麼

gdb是GNU開源組織釋出的一個強大的Unix/Linux下的程式調試工具,通過shell操作,可以實作各類IDE類似的調試功能。

3. 為什麼要使用gdb

程式猿的代碼總會有各種各樣的錯誤,這些錯誤基本可以分為兩類:

  1. 文法錯誤:編譯器會報錯,解決比較友善
  2. 邏輯錯誤:此時就需要調試代碼

雖然我們有各種各樣的IDE,但是對于從事 Linux C/C++ 開發的程式猿來說,大多數都需要熟悉gdb調試工具。尤其當不具備IDE的環境時(嵌入式系統等資源限制的場景),gdb以其占用資源少、開源免費和友善實用的優勢被廣泛使用,當然有IDE的話還是就根據個人習慣來吧。

gdb主要有以下的作用:

  1. 啟動程式,程式猿可以自定義地運作程式
  2. 讓被調試的程式在指定的斷點處停住,便于分析
  3. 當程式被停住時,可以檢查此時程式中所發生的事
  4. 動态地改變程式的執行環境

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,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

進入gdb.png

4.2 list

在gdb中使用(gdb) list(縮寫l)可以檢視代碼,可以使用list "linenum"或者list "function"檢視,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

list檢視代碼.png

4.3 break

在gdb中使用(gdb) break(縮寫b)指令來設定斷點,設定斷點的方法包括:

  1. break "function"
  2. break "linenum"
  3. break "filename":"linenum"
  4. break "filename":"function"

具體操作如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

break打斷點.png

4.4 run

在gdb中使用(gdb) run(縮寫r)運作程式,程式在斷點之前就會停下來,斷點的那一行不運作,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

run運作程式.png

4.5 單步指令

在gdb中使用(gdb) next(縮寫n)/step(縮寫s)進行單步調試。其中:

  1. next :類似于step over,不會進入函數的内部
  2. step:類似于step into,會進入函數的内部

具體的操作如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

next/step單步調試.png

4.6 continue

在gdb中使用(gdb) continue(縮寫c,fg指令同continue指令)可以恢複程式的運作直到程式結束或到達下一個斷點,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

continue指令.png

4.7 print

在gdb中使用(gdb) print(縮寫c)檢視目前程式的運作資料,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

print檢視資料.png

4.8 watch

在gdb中使用(gdb) watch來觀察某個表達式的值是否有變化了,若有變化,馬上停住程式,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

watch觀察表達式變化.png

4.9 quit

在gdb中使用(gdb) quit來退出gdb調試模式,如下圖:

Linux gdb的使用(基礎版)1. 概述2. gdb是什麼3. 為什麼要使用gdb4. 怎麼使用gdb5. 總結6. 參考文獻

quit退出gdb.png

5. 總結

本文給出了gdb的簡單操作,可以看到和常見IDE的調試操作是類似的,其實IDE不過隻是做了個圖形界面,底層調用的還是類似于gdb這樣的工具。在實際的代碼調試工作中,通過将以上的指令組合使用可以達到我們的目的。

作者雖然有着“多年的”編(copy)碼(paste)經驗,但是基本都在使用IDE調試,文中難免有不當之處,還請批評指出,謝謝!

6. 參考文獻

  1. http://www.gnu.org/software/gdb/
  2. Linux gdb調試器用法全面解析, https://www.cnblogs.com/mingcaoyouxin/p/4225619.html
  3. linux 下 GDB調試器的使用(初學者), https://blog.csdn.net/qq_42543896/article/details/107094197

歡迎大家批評指正、評論和轉載(請注明源出處),謝謝!

繼續閱讀