GNU Debugger (GDB) 是 GNU 系統的開源調試器。該調試器具有可移植性,可用於C/C++、Fortran等多種語言。它可用於通過監視特定斷點的狀態、更改流程和值以及執行更多操作來調試程序。 GDB 通常從命令行運行,但也為 GDB 開發了一些 GUI。

本文介紹如何在 Ubuntu 20.04 LTS (Focal Fossa) 上使用 GDB 調試 C 程序。

先決條件

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

筆記: 本文中描述的命令是 Ubuntu 20.04 LTS (焦點巢)。

安裝包

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

$ sudo apt install gcc gdb -y

用於調試的 C 程序示例

代碼

您需要先編譯程序,然後才能運行它。 將以下 C 代碼編譯到 main.c 文件中。

#include <stdio.h>

int main() {

for (int i=0; i<5; ++i) {
printf("Iterator: %dn", i);
}
return 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 調試程序

按 Enter。 顯示 GDB 終端的控制台。此控制台上的運行命令運行作為實用程序參數提供的可執行文件。

(gdb) run

調試輸出

調試斷點

添加斷點

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

(gdb) break printf

在 GDB 中添加斷點

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

(gdb) break 6

在 GDB 行號處添加斷點

Enter 執行命令,程序在斷點處停止。

使用斷點調試程序

單步斷點

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

(gdb) continue

GDB 繼續命令

還有另外兩個用於不同目的的命令來保持程序運行。

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

您還可以使用命令縮寫。 continue 等命令的縮寫是 c。

(gdb) c

繼續命令的快捷方式

關於斷點的信息

可以使用 gdb info 命令監視斷點信息。在終端中運行以下命令:

(gdb) info breakpoints

斷點信息

顯示有​​關斷點的信息。

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

刪除斷點

可以使用 delete 命令並引用 info 實用程序的輸出中找到的斷點編號來刪除斷點。

(gdb) delete 1

刪除 GDB 中的斷點

斷點已被移除,所以當你運行它時,程序直接運行到最後。

觀察到的變量

可以使用監視實用程序監視變量。首先,我們需要輸入變量所在的範圍。為此,首先添加以下斷點:

(gdb) break 6

然後運行到達該斷點的代碼。

(gdb) r

顯示變量內容

您現在有了一個帶有變量 i 的循環。

watch命令用於循環監控變量i的前值和新值。

(gdb) watch i

在 GDB 中觀察一個變量的值

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

(gdb) info breakpoints

GDB 信息斷點

此外,您不需要之前插入的斷點。您可以使用以下命令輕鬆刪除它:

(gdb) delete 1

刪除斷點

如果繼續這裡,代碼會檢查值並在變量改變值時顯示新舊值。

(gdb) c

繼續調試

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

反復觀看

退出調試器

通過在終端中運行以下命令退出調試器:

(gdb) quit

完成調試

將顯示一個關閉 gdb 的實用程序和一個默認的命令行提示符。

結論是

本文介紹瞭如何在 GDB 中運行和中斷程序。此外,它被配置為在變量的值發生變化時自行中斷。讀完這篇文章,希望你能用 GDB 輕鬆調試你的程序。