前言
前面我們講了C語言的基礎(chǔ)知識,也了解了一些數(shù)據(jù)結(jié)構(gòu),并且講了有關(guān)C++的一些知識,也學(xué)習(xí)了一些Linux的基本操作,也了解并學(xué)習(xí)了有關(guān)Linux開發(fā)工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代碼也相信大家都掌握的不錯(cuò),今天博主帶大家了解一下 —— Linux系統(tǒng)下的調(diào)試器-gdb、項(xiàng)目自動(dòng)化構(gòu)建工具-make/Makefile, 下面話不多說坐穩(wěn)扶好咱們要開車了?。?!??
一、什么是調(diào)試器
調(diào)試器是一種工具,用于幫助開發(fā)人員診斷和修復(fù)程序中的錯(cuò)誤。它可以讓你逐行執(zhí)行代碼,觀察變量的值,并提供有關(guān)程序執(zhí)行流程的詳細(xì)信息。
?一些常見的調(diào)試器包括:
- GDB(GNU調(diào)試器):適用于C和C++等編程語言,可在命令行界面下使用。
- LLDB(LLVM調(diào)試器):一款用于C、C++、Objective-C 和 Swift 的開源調(diào)試器,兼容多種平臺(tái)。
- Visual Studio Debugger:適用于Windows平臺(tái)的調(diào)試器,可與Microsoft Visual Studio集成使用。
- PyCharm Debugger:專為Python開發(fā)的調(diào)試器,可在PyCharm集成開發(fā)環(huán)境中使用。
- Xcode Debugger:適用于蘋果開發(fā)者的調(diào)試器,可在Mac和iOS設(shè)備上調(diào)試應(yīng)用程序。
?VS下的調(diào)試環(huán)境
?GDB命令行模式的調(diào)試
?調(diào)試器的一般使用步驟如下:
- 啟動(dòng)調(diào)試器,并將程序加載到調(diào)試器中。
- 設(shè)置斷點(diǎn),這樣程序會(huì)在斷點(diǎn)處暫停執(zhí)行。
- 逐行執(zhí)行代碼,觀察變量的值和程序的行為。
- 使用調(diào)試器提供的命令和功能來檢查程序狀態(tài)、查找錯(cuò)誤并進(jìn)行修復(fù)。
- 在逐步執(zhí)行代碼時(shí),可以觀察程序的執(zhí)行流程和控制流的變化。
- 跟蹤程序執(zhí)行流程,查找潛在的邏輯錯(cuò)誤和異常。
二、詳解 GDB - 調(diào)試器
1.使用前提
在使用GDB調(diào)試器之前,你需要滿足以下前提條件:
-
安裝GDB:首先,你需要在你的計(jì)算機(jī)上安裝GDB調(diào)試器。GDB是一個(gè)開源工具,可以從GNU項(xiàng)目的官方網(wǎng)站上下載并安裝,也可以運(yùn)行以下命令來安裝GDB調(diào)試器:
sudo apt install gdb
這將下載并安裝GDB及其相關(guān)的依賴項(xiàng)。
-
編譯可執(zhí)行文件:GDB是用于調(diào)試可執(zhí)行文件的工具,因此你需要先編譯你的程序,并生成可執(zhí)行文件。你可以使用適合你的編程語言的編譯器來完成這個(gè)步驟。
-
了解編譯選項(xiàng):為了能夠在GDB中正確地調(diào)試你的程序,你需要使用適當(dāng)?shù)木幾g選項(xiàng)來生成可調(diào)試的可執(zhí)行文件。對于大多數(shù)編譯器,你可以使用
-g
選項(xiàng)來生成調(diào)試信息。例如,對于GCC編譯器,你可以使用以下命令來編譯帶有調(diào)試信息的可執(zhí)行文件:$ gcc -g your_program.c -o your_program
這將生成一個(gè)名為
your_program
的可執(zhí)行文件,其中包含調(diào)試信息,可以在GDB中使用。
2.經(jīng)常使用的命令
-
run
:運(yùn)行程序。 -
break
:設(shè)置斷點(diǎn)。例如,break main
在程序的main
函數(shù)處設(shè)置斷點(diǎn)。 -
next
:執(zhí)行下一行代碼。 -
step
:進(jìn)入函數(shù)調(diào)用并逐行執(zhí)行函數(shù)內(nèi)部的代碼。 -
continue
:繼續(xù)執(zhí)行程序,直到下一個(gè)斷點(diǎn)或程序結(jié)束。 -
print
:打印變量的值。例如,print x
將打印變量x
的值。 -
backtrace
:查看調(diào)用棧,即程序執(zhí)行到當(dāng)前位置的函數(shù)調(diào)用序列。 -
set
:修改變量的值。例如,set x = 10
將把變量x
的值設(shè)置為10。 -
watch
:監(jiān)視表達(dá)式的值。當(dāng)表達(dá)式的值發(fā)生變化時(shí),程序會(huì)暫停執(zhí)行并顯示相關(guān)信息。 -
info breakpoints
:查看當(dāng)前設(shè)置的斷點(diǎn)信息。 -
delete
:刪除斷點(diǎn)。例如,delete 1
將刪除編號為1的斷點(diǎn)。 -
quit
:退出GDB調(diào)試器。 -
info locals
:查看當(dāng)前函數(shù)的局部變量。 -
info registers
:查看CPU寄存器的值。 -
display
:設(shè)置自動(dòng)顯示變量的值。例如,display x
將在每次程序暫停時(shí)顯示變量x
的值。 -
finish
:執(zhí)行當(dāng)前函數(shù)的剩余部分,并返回到調(diào)用該函數(shù)的地方。 -
up
:在調(diào)用棧中向上移動(dòng)一幀,查看調(diào)用當(dāng)前函數(shù)的上一層函數(shù)。 -
down
:在調(diào)用棧中向下移動(dòng)一幀,返回到當(dāng)前函數(shù)調(diào)用的函數(shù)。 -
info threads
:查看程序中的線程信息。 -
thread <thread-id>
:切換到指定的線程。 -
set pagination off
:關(guān)閉分頁功能,以便在顯示大量輸出時(shí)不會(huì)暫停。 -
record
:啟用記錄功能,可以回放程序的執(zhí)行過程。 -
info functions
:列出程序中定義的所有函數(shù)。 -
info sources
:顯示當(dāng)前已加載的源文件列表。 -
run <arguments>
:運(yùn)行程序并傳遞命令行參數(shù)。 -
set args <arguments>
:設(shè)置程序運(yùn)行時(shí)的命令行參數(shù)。 -
set environment <variable=value>
:設(shè)置程序運(yùn)行時(shí)的環(huán)境變量。 -
display /f <format> <expression>
:以指定的格式顯示表達(dá)式的值。例如,display /x $eax
以十六進(jìn)制格式顯示$eax
寄存器的值。 -
info break
:顯示所有斷點(diǎn)的信息,包括編號、位置和條件。 -
disable <breakpoint-number>
:禁用指定編號的斷點(diǎn)。 -
enable <breakpoint-number>
:啟用指定編號的斷點(diǎn)。 -
catch <exception>
:捕捉指定的異常,當(dāng)發(fā)生該異常時(shí)程序會(huì)暫停。 -
watch <expression>
:在表達(dá)式的值發(fā)生變化時(shí)暫停程序。 -
set logging on
:打開日志記錄功能,將GDB會(huì)話輸出保存到日志文件中。
3.使用小技巧
?你可以只輸入命令的首字母來執(zhí)行GDB調(diào)試器命令。GDB支持命令的縮寫,只要輸入命令的唯一識別首字母即可。例如,你可以輸入b
代替break
,n
代替next
,s
代替step
等。這樣可以更快地輸入命令并提高你的工作效率。然而,如果有多個(gè)命令以相同的首字母開頭,GDB可能無法確定你要執(zhí)行的是哪個(gè)命令,此時(shí)你需要輸入更多的字符以區(qū)分命令。
?當(dāng)你在GDB調(diào)試器中按下回車鍵時(shí),它會(huì)執(zhí)行上一條命令。這對于重復(fù)執(zhí)行相同的命令非常方便,特別是當(dāng)你需要多次執(zhí)行相同的調(diào)試操作時(shí)。只需按下回車鍵即可重復(fù)執(zhí)行上一條命令,無需重新輸入。這可以提高你的工作效率并簡化調(diào)試過程。
三、項(xiàng)目自動(dòng)化構(gòu)建工具 - make/Makefile
1. make命令
make
是一個(gè)常用的構(gòu)建工具,它在Linux系統(tǒng)中廣泛使用。它的主要功能是根據(jù)指定的規(guī)則和依賴關(guān)系自動(dòng)化構(gòu)建和編譯工程項(xiàng)目。
?語法
make
命令的基本語法:
make [選項(xiàng)] [目標(biāo)]
?常用選項(xiàng)
-
-f <文件>
或--file=<文件>
:指定使用的makefile
文件,默認(rèn)為Makefile
。 -
-C <目錄>
或--directory=<目錄>
:切換到指定的目錄后執(zhí)行make
命令。 -
-n
或--just-print
:僅打印出要執(zhí)行的命令而不實(shí)際執(zhí)行。 -
-B
或--always-make
:無條件重新構(gòu)建所有目標(biāo)。 -
-j <并行數(shù)>
或--jobs=<并行數(shù)>
:指定并行執(zhí)行的任務(wù)數(shù)。
?常用操作
-
make
:使用默認(rèn)的makefile
文件執(zhí)行構(gòu)建,默認(rèn)構(gòu)建第一個(gè)目標(biāo)。 -
make <目標(biāo)>
:指定構(gòu)建的目標(biāo)。 -
make clean
:清理構(gòu)建產(chǎn)生的中間文件和目標(biāo)文件。 -
make install
:安裝構(gòu)建生成的文件到系統(tǒng)目錄。 -
make distclean
:執(zhí)行完全清理,將構(gòu)建的文件和中間文件都刪除。
?make命令的工作原理
-
make
命令會(huì)檢查makefile
文件,找到要構(gòu)建的目標(biāo)及其依賴關(guān)系。 - 如果目標(biāo)不存在或比其依賴項(xiàng)的修改時(shí)間要舊,則需要重新構(gòu)建該目標(biāo)。
- 根據(jù)
makefile
文件中定義的規(guī)則和命令,執(zhí)行構(gòu)建操作。
?make命令的優(yōu)勢:
- 自動(dòng)化構(gòu)建:根據(jù)規(guī)則和依賴關(guān)系,只編譯需要更新的文件,提高構(gòu)建效率。
- 并行構(gòu)建:使用
-j
選項(xiàng)可以指定并行執(zhí)行的任務(wù)數(shù),加快構(gòu)建速度。 - 依賴關(guān)系管理:通過定義依賴關(guān)系,確保被修改的文件及其相關(guān)文件被正確地重新構(gòu)建。
2.Makefile文件
Makefile
是一種用于構(gòu)建和管理項(xiàng)目的配置文件,在Linux系統(tǒng)中廣泛使用。它定義了項(xiàng)目中的目標(biāo)、依賴關(guān)系以及構(gòu)建命令等信息。
?Makefile的基本結(jié)構(gòu)
一個(gè)典型的Makefile
文件包含了一系列規(guī)則和命令,每個(gè)規(guī)則由以下幾個(gè)部分組成:
<目標(biāo)>: <依賴關(guān)系>
<命令1>
<命令2>
...
-
<目標(biāo)>
:表示需要構(gòu)建的文件或目標(biāo)。它可以是一個(gè)可執(zhí)行文件、庫文件、中間文件等。Makefile
中可以定義多個(gè)目標(biāo),每個(gè)目標(biāo)對應(yīng)一個(gè)規(guī)則。 -
<依賴關(guān)系>
:表示目標(biāo)所依賴的文件或其他目標(biāo)。當(dāng)依賴關(guān)系中的文件被修改時(shí),相關(guān)的目標(biāo)需要被重新構(gòu)建。 -
<命令>
:構(gòu)建目標(biāo)所執(zhí)行的命令??梢允蔷幾g源代碼、鏈接、復(fù)制文件等操作。
?Makefile文件中常用的指令和語法
-
$(變量名)
:使用變量??梢远x和使用變量來簡化Makefile
中的重復(fù)代碼。 -
=或:=
:變量賦值。使用=
表示簡單賦值,使用:=
表示延遲賦值(變量的值在首次使用時(shí)確定,之后不再改變)。 -
#
:注釋符號,用于注釋說明。 -
@
:靜默模式。在命令前添加@
符號,表示執(zhí)行命令時(shí)不打印命令本身。 -
if...endif
:條件判斷語句。根據(jù)條件判斷是否執(zhí)行命令。 -
for...endfor
:循環(huán)語句??梢员闅v列表中的元素執(zhí)行命令。
Makefile
文件中常用的內(nèi)置變量:
-
CC
:C 編譯器的名稱。默認(rèn)為cc
。 -
CFLAGS
:C 編譯器的選項(xiàng)。如-Wall
表示打開所有警告。 -
LDFLAGS
:鏈接器的選項(xiàng)。如-lm
表示鏈接數(shù)學(xué)庫。 -
CPPFLAGS
:預(yù)處理器的選項(xiàng)。如-I
添加頭文件搜索路徑。
?Makefile的約定和慣例
-
clean
:一般會(huì)定義一個(gè)clean
目標(biāo),用于清理生成的目標(biāo)文件和中間文件。 -
all
:一般會(huì)定義一個(gè)all
目標(biāo),用于構(gòu)建項(xiàng)目的所有目標(biāo)。 -
.PHONY
:聲明一些偽目標(biāo),表示目標(biāo)不對應(yīng)任何實(shí)際的文件。常用于定義用于執(zhí)行命令而非產(chǎn)生具體文件的目標(biāo)。
?Makefile的工作原理
- 當(dāng)執(zhí)行
make
命令時(shí),它會(huì)讀取當(dāng)前目錄下的Makefile
文件。 -
Makefile
文件中定義的依賴關(guān)系和構(gòu)建規(guī)則會(huì)被解析,并根據(jù)修改時(shí)間和依賴關(guān)系確定需要重新構(gòu)建的目標(biāo)。 - 根據(jù)規(guī)則執(zhí)行構(gòu)建命令,生成目標(biāo)文件。
?這里給出一個(gè)簡單的例子來說明Makefile
的使用。假設(shè)我們有一個(gè) C 語言項(xiàng)目,包含兩個(gè)源文件:main.c
和 helper.c
,它們需要分別編譯成目標(biāo)文件,并鏈接為可執(zhí)行文件。
在這個(gè)例子中,我們首先定義了變量 CC
和 CFLAGS
,分別表示使用的 C 編譯器和編譯器選項(xiàng)。
然后,我們定義了默認(rèn)的構(gòu)建目標(biāo) all
,它依賴于目標(biāo)文件 myapp
。
myapp
目標(biāo)表示生成可執(zhí)行文件myapp
,它依賴于對象文件 main.o
和 helper.o
。該規(guī)則包含了鏈接命令,將這兩個(gè)目標(biāo)文件鏈接為可執(zhí)行文件。
main.o
和 helper.o
目標(biāo)分別表示編譯 main.c
和 helper.c
,它們都依賴于對應(yīng)的源文件。這些規(guī)則包含了編譯命令,將源文件編譯為目標(biāo)文件。
最后,我們定義了一個(gè) clean
目標(biāo),用于清理生成的可執(zhí)行文件和目標(biāo)文件。
使用 make
命令執(zhí)行這個(gè) Makefile
文件時(shí),它會(huì)自動(dòng)根據(jù)依賴關(guān)系進(jìn)行構(gòu)建。例如,如果修改了 main.c
,那么只會(huì)重新編譯 main.o
和 myapp
,而不需要重新編譯 helper.o
。
通過這樣的 Makefile
文件,我們可以方便地構(gòu)建和管理項(xiàng)目,簡化了編譯和鏈接操作。
總結(jié)
本文介紹了調(diào)試器和自動(dòng)化構(gòu)建工具的基本概念和使用方法。調(diào)試器是一種幫助程序員診斷和修復(fù)程序錯(cuò)誤的工具,常用的調(diào)試器是GDB,它提供了設(shè)置斷點(diǎn)、單步執(zhí)行、查看變量值等功能。自動(dòng)化構(gòu)建工具是一種用于管理項(xiàng)目構(gòu)建的工具,常用的工具是make,它通過makefile文件定義構(gòu)建規(guī)則和依賴關(guān)系,可以自動(dòng)化執(zhí)行編譯、鏈接等操作。通過使用調(diào)試器和自動(dòng)化構(gòu)建工具,程序員可以更高效地調(diào)試和構(gòu)建項(xiàng)目,提高開發(fā)效率和代碼質(zhì)量。
溫馨提示
感謝您對博主文章的關(guān)注與支持!在閱讀本篇文章的同時(shí),我們想提醒您留下您寶貴的意見和反饋。如果您喜歡這篇文章,可以點(diǎn)贊、評論和分享給您的同學(xué),這將對我提供巨大的鼓勵(lì)和支持。另外,我計(jì)劃在未來的更新中持續(xù)探討與本文相關(guān)的內(nèi)容。我會(huì)為您帶來更多關(guān)于Linux以及C++編程技術(shù)問題的深入解析、應(yīng)用案例和趣味玩法等。請繼續(xù)關(guān)注博主的更新,不要錯(cuò)過任何精彩內(nèi)容!文章來源:http://www.zghlxwxcb.cn/news/detail-661356.html
再次感謝您的支持和關(guān)注。我們期待與您建立更緊密的互動(dòng),共同探索Linux、C++、算法和編程的奧秘。祝您生活愉快,排便順暢!文章來源地址http://www.zghlxwxcb.cn/news/detail-661356.html
到了這里,關(guān)于【探索Linux】—— 強(qiáng)大的命令行工具 P.6(調(diào)試器-gdb、項(xiàng)目自動(dòng)化構(gòu)建工具-make/Makefile)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!