資料介紹
3.4 gdb調(diào)試器
調(diào)試是所有程序員都會(huì)面臨的問(wèn)題。如何提高程序員的調(diào)試效率,更好、更快地定位程序中的問(wèn)題從而加快程序開(kāi)發(fā)的進(jìn)度,是大家都很關(guān)注的問(wèn)題。就如讀者熟知的Windows下的一些調(diào)試工具,如Visual Studio自帶的設(shè)置斷點(diǎn)、單步跟蹤等,都受到了廣大用戶的贊賞。那么,在Linux下有什么很好的調(diào)試工具呢?
gdb調(diào)試器是一款GNU開(kāi)發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒(méi)有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的Visual Studio等工具媲美。下面就請(qǐng)跟隨筆者一步步學(xué)習(xí)gdb調(diào)試器。
3.4.1 gdb使用流程
這里給出了一個(gè)短小的程序,由此帶領(lǐng)讀者熟悉gdb的使用流程。建議讀者能夠動(dòng)手實(shí)際操作一下。
首先,打開(kāi)Linux下的編輯器vi或者emacs,編輯如下代碼(由于為了更好地熟悉gdb的操作,筆者在此使用vi編輯,希望讀者能夠參見(jiàn)3.3節(jié)中對(duì)vi的介紹,并熟練使用vi)。
/*test.c*/
#include 《stdio.h》
int sum(int m);
int main()
{
int i, n = 0;
sum(50);
for(i = 1; i《= 50; i++)
{
n += i;
}
printf(“The sum of 1-50 is %d \n”, n );
}
int sum(int m)
{
int i, n = 0;
for (i = 1; i 《= m; i++)
{
n += i;
printf(“The sum of 1-m is %d\n”, n);
}
}
在保存退出后首先使用gcc對(duì)test.c進(jìn)行編譯,注意一定要加上選項(xiàng)“-g”,這樣編譯出的可執(zhí)行代碼中才包含調(diào)試信息,否則之后gdb無(wú)法載入該可執(zhí)行文件。
[root@localhost gdb]# gcc -g test.c -o test
雖然這段程序沒(méi)有錯(cuò)誤,但調(diào)試完全正確的程序可以更加了解gdb的使用流程。接下來(lái)就啟動(dòng)gdb進(jìn)行調(diào)試。注意,gdb進(jìn)行調(diào)試的是可執(zhí)行文件,而不是如“.c”的源代碼,因此,需要先通過(guò)gcc編譯生成可執(zhí)行文件才能用gdb進(jìn)行調(diào)試。
?。踨oot@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”。
?。╣db)
可以看出,在gdb的啟動(dòng)畫(huà)面中指出了gdb的版本號(hào)、使用的庫(kù)文件等信息,接下來(lái)就進(jìn)入了由“(gdb)”開(kāi)頭的命令行界面了。
?。?)查看文件。
在gdb中鍵入“l(fā)”(list)就可以查看所載入的文件,如下所示。
注意在gdb的命令中都可使用縮略形式的命令,如“l(fā)”代表“l(fā)ist”,“b”代表“breakpoint”,“p”代表“print”等,讀者也可使用“help”命令查看幫助信息。
?。╣db) l
1 #include 《stdio.h》
2 int sum(int m);
3 int main()
4 {
5 int i,n = 0;
6 sum(50);
7 for(i = 1; i 《= 50; i++)
8 {
9 n += i;
10 }
(gdb) l
11 printf(“The sum of 1~50 is %d \n”, n );
12
13 }
14 int sum(int m)
15 {
16 int i, n = 0;
17 for(i = 1; i 《= m; i++)
18 {
19 n += i;
20 }
21 printf(“The sum of 1~m is = %d\n”, n);
20 }
可以看出,gdb列出的源代碼中明確地給出了對(duì)應(yīng)的行號(hào),這樣就可以大大地方便代碼的定位。
?。?)設(shè)置斷點(diǎn)。
設(shè)置斷點(diǎn)是調(diào)試程序中一個(gè)非常重要的手段,它可以使程序運(yùn)行到一定位置時(shí)暫停。因此,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出代碼的癥結(jié)所在。
在gdb中設(shè)置斷點(diǎn)非常簡(jiǎn)單,只需在“b”后加入對(duì)應(yīng)的行號(hào)即可(這是最常用的方式,另外還有其他方式設(shè)置斷點(diǎn)),如下所示:
(gdb) b 6
Breakpoint 1 at 0x804846d: file test.c, line 6.
要注意的是,在gdb中利用行號(hào)設(shè)置斷點(diǎn)是指代碼運(yùn)行到對(duì)應(yīng)行之前將其停止,如上例中,代碼運(yùn)行到第6行之前暫停(并沒(méi)有運(yùn)行第6行)。
?。?)查看斷點(diǎn)情況。
在設(shè)置完斷點(diǎn)之后,用戶可以鍵入“info b”來(lái)查看設(shè)置斷點(diǎn)情況,在gdb中可以設(shè)置多個(gè)斷點(diǎn)。
?。╣db) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804846d in main at test.c:6
用戶在斷點(diǎn)鍵入“backrace”(只輸入“bt”即可)可以查到調(diào)用函數(shù)(堆棧)的情況,這個(gè)功能在程序調(diào)試之中使用非常廣泛,經(jīng)常用于排除錯(cuò)誤或者監(jiān)視調(diào)用堆棧的情況。
調(diào)試是所有程序員都會(huì)面臨的問(wèn)題。如何提高程序員的調(diào)試效率,更好、更快地定位程序中的問(wèn)題從而加快程序開(kāi)發(fā)的進(jìn)度,是大家都很關(guān)注的問(wèn)題。就如讀者熟知的Windows下的一些調(diào)試工具,如Visual Studio自帶的設(shè)置斷點(diǎn)、單步跟蹤等,都受到了廣大用戶的贊賞。那么,在Linux下有什么很好的調(diào)試工具呢?
gdb調(diào)試器是一款GNU開(kāi)發(fā)組織并發(fā)布的UNIX/Linux下的程序調(diào)試工具。雖然,它沒(méi)有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的Visual Studio等工具媲美。下面就請(qǐng)跟隨筆者一步步學(xué)習(xí)gdb調(diào)試器。
3.4.1 gdb使用流程
這里給出了一個(gè)短小的程序,由此帶領(lǐng)讀者熟悉gdb的使用流程。建議讀者能夠動(dòng)手實(shí)際操作一下。
首先,打開(kāi)Linux下的編輯器vi或者emacs,編輯如下代碼(由于為了更好地熟悉gdb的操作,筆者在此使用vi編輯,希望讀者能夠參見(jiàn)3.3節(jié)中對(duì)vi的介紹,并熟練使用vi)。
/*test.c*/
#include 《stdio.h》
int sum(int m);
int main()
{
int i, n = 0;
sum(50);
for(i = 1; i《= 50; i++)
{
n += i;
}
printf(“The sum of 1-50 is %d \n”, n );
}
int sum(int m)
{
int i, n = 0;
for (i = 1; i 《= m; i++)
{
n += i;
printf(“The sum of 1-m is %d\n”, n);
}
}
在保存退出后首先使用gcc對(duì)test.c進(jìn)行編譯,注意一定要加上選項(xiàng)“-g”,這樣編譯出的可執(zhí)行代碼中才包含調(diào)試信息,否則之后gdb無(wú)法載入該可執(zhí)行文件。
[root@localhost gdb]# gcc -g test.c -o test
雖然這段程序沒(méi)有錯(cuò)誤,但調(diào)試完全正確的程序可以更加了解gdb的使用流程。接下來(lái)就啟動(dòng)gdb進(jìn)行調(diào)試。注意,gdb進(jìn)行調(diào)試的是可執(zhí)行文件,而不是如“.c”的源代碼,因此,需要先通過(guò)gcc編譯生成可執(zhí)行文件才能用gdb進(jìn)行調(diào)試。
?。踨oot@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”。
?。╣db)
可以看出,在gdb的啟動(dòng)畫(huà)面中指出了gdb的版本號(hào)、使用的庫(kù)文件等信息,接下來(lái)就進(jìn)入了由“(gdb)”開(kāi)頭的命令行界面了。
?。?)查看文件。
在gdb中鍵入“l(fā)”(list)就可以查看所載入的文件,如下所示。
注意在gdb的命令中都可使用縮略形式的命令,如“l(fā)”代表“l(fā)ist”,“b”代表“breakpoint”,“p”代表“print”等,讀者也可使用“help”命令查看幫助信息。
?。╣db) l
1 #include 《stdio.h》
2 int sum(int m);
3 int main()
4 {
5 int i,n = 0;
6 sum(50);
7 for(i = 1; i 《= 50; i++)
8 {
9 n += i;
10 }
(gdb) l
11 printf(“The sum of 1~50 is %d \n”, n );
12
13 }
14 int sum(int m)
15 {
16 int i, n = 0;
17 for(i = 1; i 《= m; i++)
18 {
19 n += i;
20 }
21 printf(“The sum of 1~m is = %d\n”, n);
20 }
可以看出,gdb列出的源代碼中明確地給出了對(duì)應(yīng)的行號(hào),這樣就可以大大地方便代碼的定位。
?。?)設(shè)置斷點(diǎn)。
設(shè)置斷點(diǎn)是調(diào)試程序中一個(gè)非常重要的手段,它可以使程序運(yùn)行到一定位置時(shí)暫停。因此,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出代碼的癥結(jié)所在。
在gdb中設(shè)置斷點(diǎn)非常簡(jiǎn)單,只需在“b”后加入對(duì)應(yīng)的行號(hào)即可(這是最常用的方式,另外還有其他方式設(shè)置斷點(diǎn)),如下所示:
(gdb) b 6
Breakpoint 1 at 0x804846d: file test.c, line 6.
要注意的是,在gdb中利用行號(hào)設(shè)置斷點(diǎn)是指代碼運(yùn)行到對(duì)應(yīng)行之前將其停止,如上例中,代碼運(yùn)行到第6行之前暫停(并沒(méi)有運(yùn)行第6行)。
?。?)查看斷點(diǎn)情況。
在設(shè)置完斷點(diǎn)之后,用戶可以鍵入“info b”來(lái)查看設(shè)置斷點(diǎn)情況,在gdb中可以設(shè)置多個(gè)斷點(diǎn)。
?。╣db) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x0804846d in main at test.c:6
用戶在斷點(diǎn)鍵入“backrace”(只輸入“bt”即可)可以查到調(diào)用函數(shù)(堆棧)的情況,這個(gè)功能在程序調(diào)試之中使用非常廣泛,經(jīng)常用于排除錯(cuò)誤或者監(jiān)視調(diào)用堆棧的情況。
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 串口/網(wǎng)絡(luò)數(shù)據(jù)調(diào)試器 1次下載
- 基于OpenOCD和GDB的簡(jiǎn)單且廉價(jià)的步進(jìn)調(diào)試器
- STM8-Debug 調(diào)試器使用
- Linux嵌入式 gdb VSCode圖形化調(diào)試教程
- Microchip調(diào)試器(MDB)用戶指南 19次下載
- 蜂鳥(niǎo)FPGA開(kāi)發(fā)板和JTAG調(diào)試器介紹 41次下載
- 使用GDB調(diào)試程序的詳細(xì)資料概述 0次下載
- PICKIT2硬件調(diào)試器的使用教程資料說(shuō)明
- Microchip公司調(diào)試器(MDB)的詳細(xì)中文資料概述
- 如何使用MPLAB ICD 3在線調(diào)試器的詳細(xì)中文資料免費(fèi)下載
- Microchip 調(diào)試器(MDB) 用戶指南
- 使用在PICkit? 3線調(diào)試器 5次下載
- 調(diào)試器模塊(可按鍵調(diào)試) 11次下載
- 基于CodeWarrior集成開(kāi)發(fā)環(huán)境的調(diào)試器原理 65次下載
- gdb使用指南
- 基于8051 IP調(diào)試器設(shè)計(jì)方案 964次閱讀
- 做了個(gè)DAPLink調(diào)試器,最高支持1500V隔離!靜電多不了一點(diǎn)! 261次閱讀
- 使用VSCode調(diào)試嵌入式程序:如何切換gdb server 4.5k次閱讀
- jlink調(diào)試器的工作原理 6k次閱讀
- 調(diào)試器連接MCU不穩(wěn)定怎么辦? 1.8k次閱讀
- 簡(jiǎn)述GDB調(diào)試器提供的基本功能 2.2k次閱讀
- 什么是GDB?GDB的基本功能和命令總結(jié) 5.4k次閱讀
- 針對(duì)嵌入式處理器的可配置LLDB底層調(diào)試器解析 1.6k次閱讀
- 通過(guò)GDB non-stop mode調(diào)試MySQL 1.3k次閱讀
- 什么是gdb的底層調(diào)試原理 1.7k次閱讀
- OpenHarmony系統(tǒng)如何使用gdb調(diào)試init 1.6k次閱讀
- QEMU+GDB調(diào)試ARM程序 4.6k次閱讀
- Linux應(yīng)用的GDB調(diào)試的原理及過(guò)程分析 3.7k次閱讀
- Python調(diào)試器,快速定位各種疑難雜癥 4k次閱讀
- 基于SOPC的M8051調(diào)試器設(shè)計(jì)及系統(tǒng)測(cè)試 3.2k次閱讀
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論