Linux調(diào)試工具GDB使用簡易教程
本文所述主要是Linux調(diào)試工具GDB的使用教程,具體如下。
聲明:本博客內(nèi)容是由本人經(jīng)過實(shí)驗(yàn)樓教程整理得來。
GDB的相關(guān)概念
GDB, 是 The GNU Project Debugger 的縮寫, 是 Linux 下功能全面的調(diào)試工具。GDB 支持?jǐn)帱c(diǎn)、單步執(zhí)行、打印變量、觀察變量、查看寄存器、查看堆棧等調(diào)試手段。在 Linux 環(huán)境軟件開發(fā)中,GDB 是主要的調(diào)試工具,用來調(diào)試 C 和 C++ 程序。
GDB的相關(guān)操作
下面給出一個具有buging.c的程序:
[yqtao@localhost linux]$ cat buging.c
#include <stdio.h>
int getSum(int n) {
int sum=0,i;
for (i=1;i<=n;i++)
sum+=i;
return sum;
}
int main(){
int res=getSum(100);
printf("1+2+...+100=%d\n",res);
}
如果要調(diào)試程序,則在進(jìn)行g(shù)cc編譯的時候要加上-g參數(shù)
gcc -g -o bugging bugging.c
進(jìn)入gdb:
gdb buging
部分gdb命令:

// 查看源碼
// 查看第幾行附近
// 可簡寫成l 2
(gdb) list 2
1 #include <stdio.h>
2 int getSum(int n) {
3 int sum=0,i;
4 for (i=1;i<=n;i++)
5 sum+=i;
6 return sum;
7 }
// 查看main函數(shù)附近的源碼
(gdb) list main
3 int sum=0,i;
4 for (i=1;i<=n;i++)
5 sum+=i;
6 return sum;
7 }
8 int main(){
9 int res=getSum(100);
10 printf("1+2+...+100=%d\n",res);
11 }
// 設(shè)置斷點(diǎn)
// break +n在第幾行設(shè)斷點(diǎn)
(gdb) break 8
Breakpoint 1 at 0x4004fa: file buging.c, line 8.
// break +函數(shù)名 ,在函數(shù)名處設(shè)斷點(diǎn)
(gdb) break getSum
Breakpoint 2 at 0x4004cb: file buging.c, line 3.
//查看斷點(diǎn)信息
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004fa in main at buging.c:8
2 breakpoint keep y 0x00000000004004cb in getSum at buging.c:3
斷點(diǎn)信息中每一項(xiàng)的信息:
1.Num 列代表斷點(diǎn)編號,該編號可以作為 delete/enalbe/disable 等控制斷點(diǎn)命令的參數(shù)
2.Type 列代表斷點(diǎn)類型,一般為 breakpoint
3.Disp 列代表斷點(diǎn)被命中后,該斷點(diǎn)保留(keep)、刪除(del)還是關(guān)閉(dis)
4.Enb 列代表該斷點(diǎn)是 enable(y) 還是 disable(n)
5.Address 列代表該斷點(diǎn)處虛擬內(nèi)存的地址
6.What 列代表該斷點(diǎn)在源文件中的信息
// 刪除斷點(diǎn) // delete +n 或 d +n // 如果不加數(shù)字則刪除全部的斷點(diǎn) (gdb) d 2 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004004fa in main at buging.c:8
關(guān)閉和啟用斷點(diǎn):
有時候,我們會遇到這種情況:有些斷點(diǎn)可能暫時不用但又不想刪除,那么可以disable.
disable +n //關(guān)閉斷點(diǎn) enable +n //啟動斷點(diǎn)
GDB單步調(diào)試
以本文開頭的buging.c文件為例,進(jìn)行單步調(diào)試。
// 進(jìn)入gdb [yqtao@localhost linux]$ gdb buging // 在main()函數(shù)處設(shè)斷點(diǎn) (gdb) info breakpoints // 運(yùn)行程序 (gdb) run Breakpoint 1, main () at buging.c:9 9 int res=getSum(100);
注意:我們要進(jìn)入函數(shù)要是用step(s),而單步執(zhí)行next(n),next是不進(jìn)入函數(shù)內(nèi)部的,要區(qū)分兩者的關(guān)系。
(gdb) step
getSum (n=100) at buging.c:4
4 for (i=1;i<=n;i++)
// 查看代碼
(gdb) l
1 #include <stdio.h>
2 int getSum(int n) {
3 int sum=0,i;
4 for (i=1;i<=n;i++)
5 sum+=i;
6 return sum;
7 }
8 int main(){
9 int res=getSum(100);
10 printf("1+2+...+100=%d\n",res);
// 下一步
(gdb) s
5 sum+=i;
// 打印sum的值
// 看到sum是為賦初值的
(gdb) p sum
$1 = 4195633
// info locals
//打印當(dāng)前斷點(diǎn)處所在函數(shù)的所有局部變量的值,不包括函數(shù)參數(shù)。
(gdb) info locals
sum = 4195635
i = 3
其余的一些命令:
finish
執(zhí)行程序到當(dāng)前函數(shù)結(jié)束
continue
執(zhí)行程序到下個斷點(diǎn)
until
until N,執(zhí)行程序到源代碼的某一行
總結(jié)
以上就是本文關(guān)于Linux調(diào)試工具GDB使用簡易教程的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
詳解Linux文件中的數(shù)據(jù)是如何被寫進(jìn)磁盤
Linux 中,我們的每一個進(jìn)程,打開的每一個文件都要有自己的 struct inode 對象和自己的文件頁緩沖區(qū)(就是所謂的內(nèi)核緩沖區(qū)),本文我們給大家介紹了Linux文件中的數(shù)據(jù)是如何被寫進(jìn)磁盤,需要的朋友可以參考下2024-05-05
linux CentOS 系統(tǒng)php和mysql命令加入到環(huán)境變量中
這篇文章主要介紹了linux CentOS 系統(tǒng)php和mysql命令加入到環(huán)境變量中的相關(guān)資料,需要的朋友可以參考下2016-12-12
Apache ab并發(fā)負(fù)載壓力測試實(shí)現(xiàn)方法
Apache的ab命令模擬多線程并發(fā)請求,測試服務(wù)器負(fù)載壓力,也可以測試nginx、lighthttp、IIS等其它Web服務(wù)器的壓力2019-09-09
Linux磁盤分區(qū)實(shí)戰(zhàn)案例(必看篇)
下面小編就為大家?guī)硪黄狶inux磁盤分區(qū)實(shí)戰(zhàn)案例(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
Apache限制IP并發(fā)數(shù)和流量控制的方法
這篇文章主要介紹了Apache限制IP并發(fā)數(shù)和流量控制的方法,需要的朋友可以參考下2014-12-12

