本節書摘來自異步社群《嵌入式 linux c 語言應用程式設計(修訂版)》一書中的第2章,第2.4節,作者 孫瓊,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
嵌入式 linux c 語言應用程式設計(修訂版)
在程式編譯通過生成可執行檔案之後,就進入了程式的調試環節。調試一直來是程式開發中的重中之重,如何使程式員能夠迅速找到錯誤的原因是一款調試器的目标。
gdb是gnu開源組織釋出的一個強大的linux下的程式調試工具,它是一種強大的指令行調試工具。
一個出色的調試器需要有以下幾項功能。
能夠運作程式,設定所有能影響程式運作的參數。
能夠讓程式讓指定的條件下停止。
能夠在程式停止時檢查所有參數的情況。
能夠根據指定條件改變程式的運作。
下面通過一個簡單的執行個體使讀者對gdb有一個感性的認識,這裡所介紹的指令都是gdb中最為基本也是最為常用的指令,希望讀者能夠動手操作,掌握gdb的使用方法。 首先,有以下程式段。
注意将此程式用gcc進行編譯時要加上“-g”選項。
1.進入gdb
進入gdb隻需輸入gdb和要調試的可執行檔案即可,如下所示:
可以看出,在gdb的啟動畫面中指出了gdb的版本号、使用的庫檔案等資訊,接下來就進入了由“(gdb)”開頭的指令行界面了。
2.檢視檔案
在gdb中鍵入‘l’(list)就可以檢視所載入的檔案,如下所示:
可以看出,gdb列出的源代碼中明确地給出了對應的行号,這樣可以大大地友善代碼的定位。
注意 在一般情況下,源代碼中的行号與使用者書寫程式中的行号是一緻的,但有時由于使用者的某些編譯選項會導緻行号不一緻的情況,是以,一定要檢視在gdb中的行号。
3.設定斷點
設定斷點可以使程式到一定位置暫停它的運作,程式員在該位置處可以友善地檢視變量的值、堆棧情況等,進而找出代碼的症結所在。
在gdb中設定斷點非常簡單,隻需在“b”後加入對應的行号即可(這是最常用的方式,另外還有其他方式設定斷點),其指令如下所示:
(gdb) b 6
breakpoint 1 at 0x804846d: file test.c, line 6.
要注意的是,在gdb中利用行号設定斷點是指代碼運作到對應行之前暫停,如上例中,代碼運作到第5行之前暫停(并沒有運作第5行)。
4.檢視斷點處情況
在設定完斷點之後,使用者可以鍵入“info b”來檢視設定斷點情況,在gdb中可以設定多個斷點。
5.運作代碼
接下來就可運作代碼了,gdb預設從首行開始運作代碼,可鍵入“r”(run)即可,在“r”後面加上行号即可從程式中指定行開始運作。
可以看到,程式運作到斷點處就停止了。
6.檢視變量值
在程式停止運作之後,程式員需要檢視斷點處的相關變量值。在gdb中隻需鍵入“p+變量值”即可,如下所示:
在此處,為什麼變量“i”的值為如此奇怪的一個數字呢?原因就在于程式是在斷點設定的對應行之前停止的,那麼在此時,并沒有把“i”的數值賦為0,而隻是一個随機的數字。但變量“n”是在第5行指派的,故在此時已經為0。
小技巧 gdb在顯示變量值時都會在對應值之前加上“$n”标記,它是目前變量值的引用标記,是以以後若想再次引用此變量就可以直接寫作“$n”,而無需寫冗長的變量名。
7.觀察變量
在某一循環處,程式員往往希望能夠觀察一個變量的變化情況,這時就可以鍵入指令“watch”來觀察變量的變化情況,如下所示:
可以看到,gdb在“n”設定了觀察點。
注意 在此處必須鍵入完整的指令“watch”,因為在gdb中有不少以‘w’開頭的指令,如“where”、“while”等。
8.單步運作
單步運作是指一次隻運作一條語句,這樣可以友善程式員來檢視程式運作的結果,在此處隻需鍵入“n”(next)即可。
可以看到,随着程式的單步運作,當“n”的值發生變化時,gdb就會自動顯示出n的變化情況。
9.程式繼續運作
指令“c”(continue)可以使gdb繼續運作以下的程式,程式在再次遇到斷點時停止,如下所示:
到此為止,使用gdb的整體過程已經結束了。以上所講述的指令是gdb中最為常見的指令,下面幾節将會詳細講解gdb的指令。
gdb中有豐富的斷點設定、删除指令,可以滿足使用者各個方面的需求。表2.8列出了gdb中常見的斷點設定及删除指令。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyADN5EjZ3UzMyY2YiV2YzAzY0IDN4gTNyU2YiNjMiBTZmR2MxcDM48CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
小知識 在多線程的程式中,觀察點的作用很有限,gdb隻能觀察在一個線程中的表達式的值。如果使用者确信表達式隻被目前線程所存取,那麼使用觀察點才有效。gdb不能注意一個非目前線程對表達式值的改變。
在gdb中也有豐富的資料顯示相關指令,他們可以使使用者可以以各種形式顯示所要檢視的資料,資料相關指令如表2.9所示。
小技巧 在使用print指令時,可以對變量按指定格式進行輸出,其指令格式為:print /變量名+格式其中格式有以下幾種方式。
x:十六進制;d:十進制;u:無符号數;o:八進制;
t:二進制;a:十六進制列印;c:字元格式;f:浮點數。
在gdb中控制程式的運作也是非常友善地,使用者可以自行設定變量值、調用函數等,其具體指令如表2.10所示。
gdb中也提供了多種堆棧相關的指令,可以檢視堆棧的情況、寄存器的情況等,其具體指令如表2.11所示。