从零上手 GDB 调试,看这个教程就够了~
前言
在為 Linux 開發(fā)應(yīng)用程序時,很多情況下都需要使用 C 語言進行開發(fā),因此幾乎每一位 Linux 程序員面臨的首要問題都是:如何靈活運用 C 編譯器。
目前 Linux 下最常用的 C 語言編譯器是 GCC。GCC 編譯器是 GNU 開源組織發(fā)布的多平臺編譯器,它可以將 C、C++ 等多種語言編寫的源程序編譯、鏈接成可執(zhí)行文件。而 GDB 是 GNU 推出的功能強大的程序調(diào)試器,可以說,GCC 與 GDB 是在 Linux 環(huán)境下進行 C 程序開發(fā)不可或缺的工具,也是 Linux 程序員必須掌握的技能之一。
GCC的歷史
GNU 計劃是由理查德·斯托曼在 1983 年 9 月 27 日公開發(fā)起的自由軟件集體協(xié)作計劃,主要目的是創(chuàng)建一個名叫 GNU’s Not Unix(GNU) 的完全免費的操作系統(tǒng)。該操作系統(tǒng)將包括絕大多數(shù)自由軟件基金會所開發(fā)的其他軟件,以對抗所有商業(yè)軟件,而這個操作系統(tǒng)的核心(kernel)就叫 HURD。
但是 GNU 在開發(fā)完全免費的操作系統(tǒng)上并未取得成功,直到 20 世紀 90 年代由林納斯·本納第克特·托瓦茲(Linus Benedict Torvalds)開發(fā)了 Linux 操作系統(tǒng),GNU 才算在免費操作系統(tǒng)上完成了任務(wù)。雖然 GNU 計劃在開發(fā)免費操作系統(tǒng)上不成功,但是卻成功開發(fā)出幾個廣為流傳的 GNU 軟件,其中最著名的是GNU C Complier(GCC)。
GCC 這個軟件成為歷史上最優(yōu)秀的 C 語言編譯器, 其執(zhí)行效率與一般的編譯器相比平均效率要高 20%~30%,使得那些靠販賣編譯器的公司大吃苦頭,因為它們無法研制出與 GCC 同樣優(yōu)秀,卻又完全免費、并開放源代碼的編譯器來。它還有一個十分特殊而且不同尋常的意義:幾乎所有的自由軟件都是通過它編譯的。可以說,它是自由軟件發(fā)展的基石與標桿。
現(xiàn)在,GCC 已經(jīng)可以支持 7 種編程語言和 30 種編程結(jié)構(gòu),是學(xué)術(shù)界最受歡迎的編譯工具。其他 GNU 軟件還包括 GNU emacs、GNU Debugger(GDB)、GNU Bash 以及大部分 Linux 系統(tǒng)的程序庫和工具等。目前,GCC 已發(fā)展到了 8.x 的版本,幾乎所有開源軟件和自由軟件中都會用到,因此它的編譯性能會直接影響到 Linux、Firefox、OpenOffice.org、Apache 以及一些數(shù)不清的小項目的開發(fā)。
GCC 無疑處在開源軟件的核心地位,經(jīng)過這么多年的發(fā)展,GCC 已經(jīng)不僅僅能支持 C 語言,它現(xiàn)在還支持 Ada、C++、Java、Objective-C、Pascal、COBOL 以及函數(shù)式編程和邏輯編程的 Mercury 語言等。因此,現(xiàn)在的 GCC 已經(jīng)變成了 GNU Compiler Collection,也即是 GNU 編譯器套件的意思了。
初步使用GCC
GCC 僅僅是一個編譯器,沒有界面,必須在命令行模式下使用。通過gcc命令就可以將源文件編譯成可執(zhí)行文件。GCC 既可以一次性完成 C 語言源文件的編譯,也可以分步驟完成。
我們先完整演示如何一次性完成源文件的編譯,讓大家對 GCC 的使用有一個初步的了解。
以下面簡單的 C 語言程序為例,打開 Sublime Text 輸入代碼,保存到桌面上,命名為 demo.c。
#include <stdio.h> int main() {puts("shiyanlou");return 0; }
生成可執(zhí)行程序
在 Linux 下編譯 C 語言程序,一般的 Linux 發(fā)行版都內(nèi)建的有 GCC,無需用戶再自行安裝。打開 Xfce 終端,使用以下命令查看 GCC 版本:
gcc -v
輸入以下命令,生成可執(zhí)行程序文件:
我們能夠發(fā)現(xiàn)在桌面上多了一個名為 a.out 的文件,這就是最終生成的可執(zhí)行文件。
這樣我們就完成了編譯和鏈接的過程。值得一提的是,Linux 不像 Windows 那樣以文件后綴來區(qū)分可執(zhí)行文件,Linux 下的可執(zhí)行文件后綴理論上可以是任意的,這里的 .out 只是用來表明它是 GCC 的輸出文件。不管源文件的名字是什么,GCC 生成的可執(zhí)行文件的默認名字始終是 a.out。
如果不想使用默認的文件名,那么可以通過 -o 選項來自定義文件名:
$ gcc demo.c -o demo.out這樣生成的可執(zhí)行程序的名字就是 demo.out。可執(zhí)行文件也可以不帶后綴,因為 Linux 下可執(zhí)行文件的后綴僅僅是一種形式上的:
$ gcc demo.c -o demo這樣生成的可執(zhí)行程序的名字就是 demo。
通過 -o 選項也可以將可執(zhí)行文件輸出到其他目錄,并不一定非得在當前目錄下,例如:
$ gcc democ -o ../demo.out表示將可執(zhí)行文件輸出到上一層目錄,并命名為 demo.out。../ 表示上一層目錄,如果不寫,默認也是當前目錄。這里的上一層目錄是 shiyanlou,打開該目錄能夠看到生成的可執(zhí)行文件 demo.out。
運行可執(zhí)行程序
既然我們已經(jīng)生成了可執(zhí)行程序,現(xiàn)在我們來學(xué)著如何運行它。執(zhí)行以下命令:
$ ./a.out./ 表示當前目錄,整條命令的意思是運行當前目錄下的 a.out 程序。如果不寫./,Linux 會到系統(tǒng)路徑下查找 a.out,而系統(tǒng)路徑下顯然不存在這個程序,所以會運行失敗。
**注意:**如果程序沒有執(zhí)行權(quán)限,可以使用 sudo chmod 777 a.out 命令來增加權(quán)限。
到這里,一次完整的編譯流程就結(jié)束了。以上內(nèi)容出自實驗樓課程——《GDB基礎(chǔ)入門實戰(zhàn)》。
課程通過動手實驗學(xué)習(xí) Linux 上 GCC 編譯與 GDB 調(diào)試 C 語言程序的基本技巧。分別對 GCC 編譯和 GDB 調(diào)試進行了詳細介紹。
你將學(xué)習(xí)到:
課程地址:GDB 基礎(chǔ)入門實戰(zhàn)
總結(jié)
以上是生活随笔為你收集整理的从零上手 GDB 调试,看这个教程就够了~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞机器学习需要数学基础吗?
- 下一篇: 偷懒大法好,用 selenium 做 w