如何在 Ubuntu 20.04 中使用 GDB 調試程序

GNU Debugger (GDB) 是 GNU 系統的開源調試器。 調試器是可移植的,可用於 C/C++ 和 Fortran 等多種語言。 它可用於通過觀察特定斷點上的狀態甚至更改流程或值以進一步執行來調試程序。 通常,GDB 在命令行中運行,但也為它開發了幾個 GUI。

在本文中,我們將探討如何在 Ubuntu 20.04 LTS (Focal Fossa) 中使用 GDB 調試 C 程序。

先決條件

  • Ubuntu 20.04 系統
  • 用戶與 sudo 重命名多個文件的權限。

筆記: 本文中討論的命令已在 Ubuntu 20.04 LTS (焦點窩)。

安裝包

安裝必備的 GN 包以進行編譯和調試。 在終端中運行以下命令:

$ sudo apt 安裝 gcc gdb -y

C-程序 example 用於調試

代碼

在運行之前,需要編譯一個程序。 我們將在文件 main.c 中編譯以下 C 代碼。

#include int main() { for (int i=0; i<5; ++i) { printf("Iterator: %dn", i); } 返回 0; }

使用 GCC 編譯 C 程序

通常,使用以下命令在 GCC 中編譯 C 代碼:

$ gcc main.c -o bin

需要提供另一個參數以在二進製文件中包含符號。 GDB 使用這些符號來跟踪和調試程序。 在終端中運行以下命令來編譯 C 代碼:

$ gcc -g main.c -o bin

編譯程序

將出現一個名為 bin 的可執行文件。

執行測試程序

名為 bin 的二進製文件可以像命令行界面上的任何其他可執行文件一樣執行。 使用以下命令在終端中運行它:

$ ./bin

執行測試應用程序

代碼的輸出將出現。

在 Linux 上調試應用程序

啟動調試器

在終端中使用以下命令運行 GDB 實用程序:

$ gdb bin

使用 GDB 調試程序

按回車鍵。 將出現 GDB 終端的控制台。 Enter 此控制台中的 run 命令運行作為參數提供給實用程序的可執行文件。

(gdb) 運行

調試輸出

調試斷點

添加斷點

可以通過多種方式添加斷點。 我們將在代碼中的 printf 函數上添加一個斷點。 在終端中運行以下命令添加斷點:

(gdb) 中斷 printf

在 GDB 中添加斷點

或者,也可以使用行號來添加斷點。

(gdb) 突破 6

在 GDB 中按行號添加斷點

Enter 運行命令和程序將在斷點處停止。

使用斷點調試程序

單步執行斷點

使用命令 continue 繼續執行程序。

(gdb) 繼續

GDB 繼續命令

還有另外兩個用於不同目的的命令來繼續執行程序:

  • Step:逐步執行下一條機器指令。
  • Next:逐步執行下一行代碼。

也可以使用命令的縮寫。 像 continue 命令的縮寫是 c。

(gdb) c

繼續命令的快捷方式

關於斷點的信息

可以使用 gdb 的 info 命令觀察斷點信息。 在終端運行以下命令:

(gdb) 信息斷點

斷點信息

將出現有關斷點的信息。

注意:斷點左邊的數字是用來被其他命令引用的。

刪除斷點

可以使用 delete 命令並參考在 info 實用程序的輸出中觀察到的斷點編號來刪除斷點。

(gdb) 刪除 1

刪除 GDB 中的 Btreakpoints

現在斷點已被刪除,如果運行,程序將直接執行到最後。

觀察變量

可以使用 watch 實用程序監視變量。 首先,我們需要輸入變量存在的作用域。 為此,首先使用以下命令添加斷點:

(gdb) 突破 6

然後運行命中該斷點的代碼。

(gdb) r

顯示變量內容

現在我們處於變量 i 存在的循環中。

watch 命令將用於觀察循環中變量 i 的先前值和新值。

(gdb) 看我

使用 GDB 觀察變量的值

現在 watch 命令生成的斷點也將出現在斷點列表中。 可以使用以下命令顯示斷點列表:

(gdb) 信息斷點

GDB 信息斷點

而且,我們不需要之前插入的斷點。 可以使用以下命令輕鬆刪除它:

(gdb) 刪除 1

刪除斷點

現在,如果繼續,代碼將在變量更改值時查看值並顯示舊值和新值。

(gdb) c

繼續調試

也可以使用相同的命令觀察程序的進一步迭代。

觀看迭代

退出調試器

在終端中運行以下命令以退出調試器。

(gdb) 退出

退出調試

這 close gdb 實用程序和默認的命令行提示符將出現。

結論

在本文中,我們探討瞭如何在 GDB 中運行和中斷程序。 此外,它還被配置為在變量的值發生變化時自行中斷。 我們希望您在閱讀本文後可以輕鬆地在 GDB 中調試您的程序。