91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Linux中怎么使用gdb調試C程序

發布時間:2021-10-23 09:32:06 來源:億速云 閱讀:191 作者:小新 欄目:系統運維

這篇文章主要為大家展示了“在Linux中怎么使用gdb調試C程序”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“在Linux中怎么使用gdb調試C程序”這篇文章吧。

無論多么有經驗的程序員,開發的任何軟件都不可能完全沒有 bug。因此,排查及修復 bug 成為軟件開發周期中最重要的任務之一。有許多辦法可以排查  bug(測試、代碼自審等等),但是還有一些專用軟件(稱為調試器)可以幫助準確定位問題的所在,以便進行修復。

在Linux中怎么使用gdb調試C程序

如果你是 C/C++ 程序員,或者使用 Fortran 和 Modula-2 編程語言開發軟件,那么你將會很樂意知道有這么一款優秀的調試器 - GDB -  可以幫你更輕松地調試代碼 bug 以及其它問題。在這篇文章中,我們將討論一下 GDB 調試器的基礎知識,包括它提供的一些有用的功能/選項。

在我們開始之前,值得一提的是,文章中的所有說明和示例都已經在 Ubuntu 14.04 LTS 中測試過。教程中的示例代碼都是 C 語言寫的;使用的  shell 為 bash(4.3.11);GDB 版本為 7.7.1。

GDB 調試器基礎

通俗的講,GDB 可以讓你看到程序在執行過程時的內部流程,并幫你明確問題的所在。我們將在下一節通過一個有效的示例來討論 GDB  調試器的用法,但在此之前,我們先來探討一些之后對你有幫助的基本要點。

首先,為了能夠順利使用類似 GDB 這樣的調試器,你必須以指定的方式編譯程序,讓編譯器產生調試器所需的調試信息。例如,在使用 gcc  編譯器(我們將在本教程之后的章節用它來編譯 C 程序示例)編譯代碼的時候,你需要使用 -g 命令行選項。

想要了解 gcc 編譯器手冊頁中關于 -g 命令行選項相關的內容,請看這里。

下一步,確保在你的系統中已經安裝 GDB 調試器。如果沒有安裝,而且你使用的是基于 Debian 的系統(如  Ubuntu),那么你就可以使用以下命令輕松安裝該工具:

sudo apt-get install gdb

在其他發行版上的安裝方法,請看這里。

現在,當你按照上述的方式編譯完程序(gcc -g 命令行選項),同時也已經安裝好 GDB 調試器,那么你就可以使用以下命令讓程序在調試模式中運行:

gdb [可執行程序的名稱]

這樣做會初始化 GDB 調試器,但你的可執行程序此時還不會被啟動。在這個時候你就可以定義調試相關的設置。例如,你可以在特定行或函數中設置一個斷點讓 GDB  在該行暫停程序的執行。

接著,為了啟動你的程序,你必須輸入執行以下 gdb 命令:

run

在這里,值得一提的是,如果你的程序需要一些命令行參數,那么你可以在這里指定這些參數。例如:

run [參數]

GDB 提供了很多有用的命令,在調試的時候總是能派的上用場。我們將在下一節討論其中一部分命令。

GDB 調試器用例

現在我們對 GDB 及其用法有了基本的概念。因此,讓我們舉例來應用所學的知識。這是一段示例代碼:

#include  int main(){ int out = 0, tot = 0, cnt = 0; int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};  while(cnt < 10) { out = val[cnt]; tot = tot + 0xffffffff/out; cnt++; }  printf("\n Total = [%d]\n", tot); return 0;}

簡單說明一下這段代碼要做什么事。獲取 val 數組中每一個值,將其賦值給 out 變量,然后將 tot 之前的值與 0xffffffff/out  的結果值累加,賦值給 tot 變量。

這里遇到的問題是,當執行這段代碼編譯后的可執行程序時,產生以下錯誤:

$ ./gdb-testFloating point exception (core dumped)

因此,要調試這段代碼,***步是使用 -g 選項編譯程序。命令如下:

gcc -g -Wall gdb-test.c -o gdb-test

接著,讓我們運行 GDB 調試器并指定要調試的可執行程序。命令如下:

gdb ./gdb-test

現在,我剛才得到的錯誤是 Floating point exception,大部分人可能已經知道,這是因為 n % x,當 x 為 0  時導致的錯誤。所以,考慮到這一點,我在 11 行代碼除法運算的位置處添加了一個斷點。如下:

(gdb)&;break 11

注意 (gdb) 是調試器的提示信息,我只輸入了 break 11 命令。

現在,讓 GDB 開始運行程序:

run

當斷點***次被***時,GDB 顯示如下輸出:

Breakpoint 1, main () at gdb-test.c:11  11 tot = tot + 0xffffffff/out;  (gdb)

正如你所看到的那樣,調試器會顯示斷點所在的行代碼。現在,讓我們打印出此時 out 的值。如下:

(gdb) print out$1 = 5(gdb)

如上所示,值 5 被打印出來了。這個時候一切都還是正常的。讓調試器繼續執行程序直到***下一個斷點,可以通過使用 c 命令來完成:

c

重復上述操作,直到 out 值變為 0 時。

...  ...  ...  Breakpoint 1, main () at gdb-test.c:11  11 tot = tot + 0xffffffff/out;  (gdb) print out  $2 = 99  (gdb) c  Continuing.  Breakpoint 1, main () at gdb-test.c:  1111 tot = tot + 0xffffffff/out;  (gdb) print out  $3 = 0  (gdb)

現在,為了進一步確認問題,我使用 GDB 的 s(或 step) 命令代替 c 命令。因為,我只想讓當前程序在第 11  行之后暫停,再一步步執行,看看這個時候是否會發生崩潰。

以下是執行之后輸出信息:

(gdb) s  Program received signal SIGFPE, Arithmetic exception.  0x080484aa in main () at gdb-test.c:  1111 tot = tot + 0xffffffff/out;

是的,如上輸出的***行內容所示,這就是拋出異常的地方。當我再次嘗試運行 s 命令時,問題最終也得到了確認:

(gdb) s  Program terminated with signal SIGFPE, Arithmetic exception.  The program no longer exists.

通過這種方式,你就可以使用 GDB 調試你的程序。

以上是“在Linux中怎么使用gdb調試C程序”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉屏| 彭水| 冷水江市| 通山县| 河间市| 普安县| 通许县| 莱阳市| 神木县| 台中县| 日喀则市| 务川| 德兴市| 土默特左旗| 宁武县| 平顺县| 林西县| 眉山市| 菏泽市| 大同县| 北川| 桐柏县| 广平县| 成安县| 青州市| 德州市| 隆回县| 平遥县| 静海县| 原平市| 敦化市| 郓城县| 梁山县| 将乐县| 东乡县| 克山县| 浙江省| 四子王旗| 新民市| 扎囊县| 济阳县|