- 嵌入式Linux C語言程序設計基礎教程(微課版)
- 華清遠見嵌入式學院 劉洪濤 苗德行主編
- 2332字
- 2021-01-08 20:44:08
1.4 嵌入式Linux調試器GDB的使用

GDB
在程序編譯通過生成可執行文件之后,就進入了程序的調試環節。調試一直是程序開發的重中之重,如何使程序員迅速找到錯誤的原因是一款調試器的首要目標。
GDB 是 GNU 開源組織發布的一個 Linux 下的程序調試工具,它是一種強大的命令行調試工具。
一個出色的調試器需要有以下幾項功能。
① 能夠運行程序,設置所有能影響程序運行的參數。
② 能夠讓程序在指定的條件下停止運行。
③ 能夠在程序停止時檢查所有參數的情況。
④ 能夠根據指定條件改變程序的運行。
1.4.1 GDB使用實例
下面是一個簡單的實例,希望讀者對 GDB有一個感性的認識。這里所介紹的指令都是 GDB中最為基本也是最為常用的指令,希望讀者能夠動手操作,掌握GDB的使用方法。
首先,有以下程序段。
#include <stdio.h>
/*子函數add:將自然數從1~m相加*/
int add(int m)
{
int i,n=0;
for(i=1; i<=m;i++)
n += i;
printf("The sum of 1-%d in add is %d\n", m,n);
}
int main()
{
int i,n=0;
add(50);
for(i=1; i<=50; i++)
n += i;
printf("The sum of 1-50 is %d \n", n );
}
注意,將此程序用GCC進行編譯時要加上“-g”選項。
1.進入GDB
進入GDB只需輸入GDB和要調試的可執行文件即可,如下所示。
[root@localhost gdb]# gdb test
GNU gdb Red Hat Linux (6.3.0.0-1.21rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library"/lib/libthread_db.so.1".
(gdb)
可以看出,在 GDB 的啟動畫面中指出了 GDB 的版本號、使用的庫文件等信息,接下來就進入由“(gdb)”開頭的命令行界面了。
2.查看文件
在GDB中鍵入“l”(list)就可以查看所載入的文件,如下所示。
(gdb) l
4 {
5 int i,n=0;
6 for(i=1; i<=m;i++)
7 n += i;
8 printf("The sum of 1-%d in add is %d\n", m,n);
9 }
10
11 int main()
12 {
13 int i,n=0;
(gdb) 1
14 add(50);
15 for(i=1; i<=50; i++)
16 {
17 n += i;
18 }
19 printf("The sum of 1-50 is %d \n", n );
20
21 }
22
可以看出,GDB列出的源代碼中明確地給出了對應的行號,這樣可以大大地方便代碼的定位。
注意
在一般情況下,源代碼中的行號與用戶書寫程序中的行號是一致的,但有時用戶的某些編譯選項會導致行號不一致的情況,因此,一定要查看在GDB中的行號。
3.設置斷點
設置斷點可以使程序執行到某個位置時暫時停止,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出問題的癥結所在。
在GDB中設置斷點非常簡單,只需在“b”后加入對應的行號即可(這是最常用的方法),其命令如下所示。
(gdb) b 6
Breakpoint 1 at 0x804846d: file test.c, line 6.
要注意的是,在GDB中利用行號設置斷點是指代碼運行到對應行之前暫停,如上例中,代碼運行到第6行之前暫停(并沒有運行第6行)。
4.查看斷點處情況
在設置完斷點之后,用戶可以鍵入“info b”來查看斷點設置情況。在GDB中可以設置多個斷點。
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804846d in main at test.c:6
5.運行代碼
接下來就可運行代碼了,GDB 默認從首行開始運行代碼,可鍵入“r”(run)即可,在“r”后面加上行號即可從程序中指定行開始運行。
(gdb) r
Starting program: /home/yul/book/test
Breakpoint 1, add (m=50) at test.c:6
6 for(i=1; i<=m;i++)
可以看到,程序運行到斷點處就停止了。
6.查看變量值
在程序停止運行之后,程序員可以查看斷點處的相關變量值,在GDB中只需鍵入“p變量名”即可,如下所示。
(gdb) p n
$1 = 0
(gdb) p i
$2 = 134518440
在此處,為什么變量i的值是如此奇怪的一個數字呢?原因就在于程序是在斷點設置的對應行之前停止的,此時代碼沒有把變量i的值賦為0,而只是一個隨機的數字。但變量n是在程序第5行賦值的,所以此時n的值已經為0。
技巧
GDB 在顯示變量值時都會在對應值之前加上“$N”標記,它是當前變量值的引用標記,所以以后若想再次引用此變量就可以直接寫作“$N”,而無需寫冗長的變量名。
7.觀察變量
在某一循環處,程序員往往希望能夠觀察一個變量的變化情況,這時就可以鍵入命令“watch”來觀察變量的變化情況,如下所示。
(gdb) watch n
Hardware watchpoint 2: n
可以看到,GDB在“n”設置了觀察點。
提示
在此處必須鍵入完整的命令“watch”,因為在GDB中有不少以“w”開頭的命令,如“where”“while”等。
8.單步運行
單步運行是指一次只運行一條語句,這樣可以方便程序員來查看程序運行的結果,在此處只需鍵入“n”(next)即可。
(gdb) n
7 n += i;
(gdb) n
Hardware watchpoint 2: n
Old value = 15
New value = 21
可以看到,隨著程序的單步運行,當變量n的值發生變化時,GDB就會自動顯示出n的變化情況。
9.程序繼續運行
命令“c”(continue)可以使程序繼續往下運行,直到再次遇到斷點或程序結束,如下所示。
(gdb) c
Continuing.
The sum of 1-50 is 1275
Program exited with code 031.
10.退出GDB
退出GDB只需使用指令“q”(quit)即可,如下所示。
(gdb) q
[root@localhost gcc]
以上所介紹的是GDB中最為常見的命令,下面幾小節將會詳細講解其他的一些命令。
1.4.2 設置/刪除斷點
GDB中有豐富的斷點設置/刪除命令,可以滿足用戶各個方面的需求。表1-8所示為GDB中常見的斷點設置與刪除命令。
表1-8 GDB中常見斷點設置與刪除命令

提示
在多線程的程序中,觀察點的作用很有限,GDB只能觀察在一個線程中的表達式的值。如果用戶確信表達式只被當前線程所存取,那么使用觀察點才有效。GDB不能注意一個非當前線程對表達式值的改變。
1.4.3 數據相關命令
GDB中也有豐富的數據顯示相關命令,它們可以使用戶以各種形式顯示所要查看的數據,數據相關命令如表1-9所示。
表1-9 GDB中數據相關命令

提示
在使用print命令時,可以對變量按指定格式進行輸出,其命令格式為:print /變量名+格式,其中格式有以下幾種形式。
X:十六進制;d:十進制;u:無符號數;o:八進制;
T:二進制;a:十六進制打印;c:字符格式;f:浮點數。
1.4.4 調試運行環境相關命令
在GDB中控制程序的運行也是非常方便的,用戶可以自行設定變量值、調用函數等,其具體命令如表1-10所示。
表1-10 GDB調試運行環境相關命令

續表

1.4.5 堆棧相關命令
GDB中也提供了多種堆棧相關的命令,可以查看堆棧的情況、寄存器的情況等,其具體命令如表1-11所示。
表1-11 GDB中堆棧相關命令

- Java語言程序設計
- PHP 編程從入門到實踐
- UI智能化與前端智能化:工程技術、實現方法與編程思想
- Hands-On Enterprise Automation with Python.
- C#程序設計基礎:教程、實驗、習題
- Kotlin從基礎到實戰
- Protocol-Oriented Programming with Swift
- ASP.NET 4.0 Web程序設計
- INSTANT Apache ServiceMix How-to
- 進入IT企業必讀的324個Java面試題
- IPython Interactive Computing and Visualization Cookbook
- DB2SQL性能調優秘笈
- Shopify Application Development
- JavaScript前端開發基礎教程
- 從“1”開始3D編程