天天看點

《嵌入式 Linux C 語言應用程式設計(修訂版)》一2.4 嵌入式Linux調試器GDB的使用

本節書摘來自異步社群《嵌入式 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中常見的斷點設定及删除指令。

《嵌入式 Linux C 語言應用程式設計(修訂版)》一2.4 嵌入式Linux調試器GDB的使用

小知識 在多線程的程式中,觀察點的作用很有限,gdb隻能觀察在一個線程中的表達式的值。如果使用者确信表達式隻被目前線程所存取,那麼使用觀察點才有效。gdb不能注意一個非目前線程對表達式值的改變。

在gdb中也有豐富的資料顯示相關指令,他們可以使使用者可以以各種形式顯示所要檢視的資料,資料相關指令如表2.9所示。

《嵌入式 Linux C 語言應用程式設計(修訂版)》一2.4 嵌入式Linux調試器GDB的使用

小技巧 在使用print指令時,可以對變量按指定格式進行輸出,其指令格式為:print /變量名+格式其中格式有以下幾種方式。

x:十六進制;d:十進制;u:無符号數;o:八進制;

t:二進制;a:十六進制列印;c:字元格式;f:浮點數。

在gdb中控制程式的運作也是非常友善地,使用者可以自行設定變量值、調用函數等,其具體指令如表2.10所示。

《嵌入式 Linux C 語言應用程式設計(修訂版)》一2.4 嵌入式Linux調試器GDB的使用

gdb中也提供了多種堆棧相關的指令,可以檢視堆棧的情況、寄存器的情況等,其具體指令如表2.11所示。

《嵌入式 Linux C 語言應用程式設計(修訂版)》一2.4 嵌入式Linux調試器GDB的使用

繼續閱讀