Emacs調(diào)試中GUD調(diào)試器的特性是什么,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
十多年的化隆網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整化隆建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“化隆網(wǎng)站設(shè)計(jì)”,“化隆網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
下面簡(jiǎn)短地對(duì) Emacs 的調(diào)試工具 GUD 的特性進(jìn)行了探索。
如果你是一個(gè) C 或 C++ 開(kāi)發(fā)者,你很可能已經(jīng)使用過(guò) GDB(GNU 調(diào)試器),毫無(wú)疑問(wèn),它是現(xiàn)今最強(qiáng)大、最無(wú)可匹敵的調(diào)試器之一。它唯一的缺點(diǎn)就是它基于命令行,雖然仍能提供許多強(qiáng)大的功能,但有時(shí)也會(huì)具有一些局限性。這也就是為什么聰明的人們開(kāi)始追求整合了編輯器和調(diào)試器的圖形化集成開(kāi)發(fā)環(huán)境。仍有些開(kāi)發(fā)者堅(jiān)信使用鼠標(biāo)會(huì)降低工作效率,在 GUI 上用鼠標(biāo)點(diǎn)~點(diǎn)~點(diǎn)~是來(lái)自惡魔的誘惑。
因?yàn)?Emacs 是現(xiàn)今最酷的文本編輯器之一,我將為你展示如何在不碰鼠標(biāo)且不離開(kāi) Emacs 的情況下,實(shí)現(xiàn)寫(xiě)代碼、編譯代碼、調(diào)試代碼的過(guò)程。
GUD(LCTT 譯注:全稱大統(tǒng)一調(diào)試器,鑒于其縮寫(xiě)形式更為人熟知,以下全文將使用縮寫(xiě)替代此全稱)是 Emacs 下的一個(gè)模式,用于在 Emacs 中運(yùn)行 GDB。它向 GDB 提供了 Emacs 的所有特性,使用戶無(wú)需離開(kāi)編輯器就可以對(duì)代碼進(jìn)行調(diào)試。
如果你正在使用一個(gè) Linux 機(jī)器,很可能你已經(jīng)安裝了 GDB 和 gcc,接下來(lái)就是要確保已經(jīng)安裝了 Emacs。以下的內(nèi)容我將假設(shè)讀者熟悉 GDB 并且至少用它做過(guò)基本的調(diào)試。如果你未曾接觸過(guò) GDB,你可以做個(gè)快速入門(mén),這些資料在網(wǎng)上隨處可得。
對(duì)于那些 Emacs 新手,我將向你介紹一些基本術(shù)語(yǔ)??v覽整篇文章,你將看到諸如 C-c M-x
等快捷鍵。此處 C
代表 Ctrl
鍵,M
代表 Alt
鍵。C-c
代表 Ctrl
鍵和 c
鍵被同時(shí)按下。如果你看到 C-c c
,它代表同時(shí)按下 Ctrl
鍵和 c
鍵,釋放后緊接著按下 c
鍵。在 Emacs 中,編輯文本的主要區(qū)域被稱為主緩沖區(qū),而在 Emacs 窗口下方用于輸入命令的區(qū)域被稱為迷你緩沖區(qū)。
啟動(dòng) Emacs,并按下 C-x C-f
來(lái)創(chuàng)建一個(gè)新文件。Emacs 將提示你輸入一個(gè)文件名,此處讓我們將文件命名為 buggyFactorial.cpp
。一旦文件打開(kāi),輸入如下代碼:
#include#include int factorial(int num) { int product = 1; while(num--) { product *= num; } return product;}int main() { int result = factorial(5); assert(result == 120);}
使用 C-x C-s
快捷鍵保存文件。文件保存完畢,是時(shí)候進(jìn)行編譯了。按下 M-x
,在彈出的提示符后輸入 compile
并點(diǎn)擊回車。然后在提示符后,將內(nèi)容替換為 g++ -g buggyFactorial.cpp
并再次點(diǎn)擊回車。
圖 1: Emacs 迷你緩沖區(qū)中編譯命令
這將在 Emacs 中開(kāi)啟另一個(gè)緩沖區(qū),顯示編譯的狀態(tài)。如果你的代碼輸入沒(méi)有錯(cuò)誤,你將預(yù)期得到如圖 2 所示的緩沖區(qū)。
圖 2: 編譯狀態(tài)
要想隱藏編譯緩沖區(qū),首先確保你的光標(biāo)在編譯緩沖區(qū)中(你可以不使用鼠標(biāo),而是通過(guò) C-x o
快捷鍵將光標(biāo)從一個(gè)緩沖區(qū)移動(dòng)到另一個(gè)),然后按下 C-x 0
。下一步就是運(yùn)行代碼,并觀察是否運(yùn)行良好。按下 M-!
快捷鍵并在迷你緩沖區(qū)的提示符后面輸入 ./a.out
。
圖 3: 代碼在迷你緩沖區(qū)中的輸出
你可以看到迷你緩沖區(qū)中顯示斷言失敗。很明顯代碼中有錯(cuò)誤,因?yàn)?5 的階乘是 120。那么讓我們現(xiàn)在開(kāi)始調(diào)試吧。
現(xiàn)在,我們的代碼已經(jīng)編譯完成,是時(shí)候看看到底哪里出錯(cuò)了。按下 M-x
快捷鍵并在提示符后輸入 gdb
。在接下來(lái)的提示符后,輸入 gdb -i=mi a.out
。如果一切順利,GDB 會(huì)在 Emacs 緩沖區(qū)中啟動(dòng),你會(huì)看到如圖 4 所示的窗口。
圖 4: Emacs 中的 GDB 緩沖區(qū)
在 gdb
提示符后,輸入 break main
來(lái)設(shè)置斷點(diǎn),并輸入 r
來(lái)運(yùn)行程序。程序會(huì)開(kāi)始運(yùn)行并停在 main()
函數(shù)處。
一旦 GDB 到達(dá)了 main
處設(shè)置的斷點(diǎn),就會(huì)彈出一個(gè)新的緩沖區(qū)顯示你正在調(diào)試的代碼。注意左側(cè)的紅點(diǎn),正是你設(shè)置斷點(diǎn)的位置,同時(shí)會(huì)有一個(gè)小的標(biāo)志提示你當(dāng)前代碼運(yùn)行到了哪一行。當(dāng)前,該標(biāo)志就在斷點(diǎn)處(如圖 5)。
圖 5: GDB 與代碼顯示在兩個(gè)分離的窗口
為了調(diào)試 factorial
函數(shù),我們需要單步運(yùn)行。想要達(dá)到此目的,你可以在 GBD 提示符使用 GDB 命令 step
,或者使用 Emacs 快捷鍵 C-c C-s
。還有其它一些快捷鍵,但我更喜歡 GDB 命令。因此我將在本文的后續(xù)部分使用它們。
單步運(yùn)行時(shí)讓我們注意一下局部變量中的階乘值。參考圖 6 來(lái)設(shè)置在 Emacs 幀中顯示局部變量值。
圖 6: 在 Emacs 中使用獨(dú)立幀顯示局部變量
在 GDB 提示符中進(jìn)行單步運(yùn)行并觀察局部變量值的變化。在循環(huán)的第一次迭代中,我們發(fā)現(xiàn)了一個(gè)問(wèn)題。此處乘法的結(jié)果應(yīng)該是 5 而不是 4。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。