以下文章**陳皓csdn部落格:
用gdb除錯程式
gdb概述
————
gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖
形介面方式的,像vc、bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc、bcb的圖形化偵錯程式更強大的功
能。所謂「寸有所長,尺有所短」就是這個道理。
一般來說,gdb主要幫忙你完成下面四個方面的功能:
1、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
2、可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
3、當程式被停住時,可以檢查此時你的程式中所發生的事。
4、動態的改變你程式的執行環境。
從上面看來,gdb和一般的除錯工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現gdb這個除錯工具的強大,大家可能比較習慣了圖形化的除錯工具,但有時候,命令列的除錯工具卻有著圖形化工具所不能完成的功能。讓我們一一看來。
乙個除錯示例
——————
源程式:tst.c
1 #include
23 int func(int n)
4 10 return sum;
11 }
1213
14 main()
15 22
23 printf("result[1-100] = %d /n", result ); //注:在個人ubuntu上測試時long型別需%ld--可能64位緣故
24 printf("result[1-250] = %d /n", func(250) );
25 }
編譯生成執行檔案:(linux下)
hchen/test> cc -g tst.c -o tst
使用gdb除錯:
breakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。
17 long result = 0;
(gdb) n <--------------------- 單條語句執行,next命令簡寫。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <--------------------- 繼續執行程式,continue命令簡寫。
continuing.
result[1-100] = 5050 <----------程式輸出。
breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <--------------------- 列印變數i的值,print命令簡寫。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <--------------------- 檢視函式堆疊。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <--------------------- 退出函式。
run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf("result[1-250] = %d /n", func(250) );
value returned is $6 = 31375
(gdb) c <--------------------- 繼續執行。
continuing.
result[1-250] = 31375 <----------程式輸出。
program exited with code 027. <--------程式退出,除錯結束。
(gdb) q <--------------------- 退出gdb。
hchen/test>
好了,有了以上的感性認識,還是讓我們來系統地認識一下gdb吧。
使用gdb
————
一般來說gdb主要除錯的是c/c++的程式。要除錯c/c++的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器(cc/gcc/g++)的 -g 引數可以做到這一點。如:
> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello
如果沒有-g,你將看不見程式的函式名、變數名,所代替的全是執行時的記憶體位址。當你用-g把除錯資訊加入之後,並成功編譯目標**以後,讓我們來看看如何用gdb來除錯他。
啟動gdb的方法有以下幾種:
1、gdb
program也就是你的執行檔案,一般在當然目錄下。
2、gdb core
用gdb同時除錯乙個執行程式和core檔案,core是程式非法執行後core dump後產生的檔案。
3、gdb
如果你的程式是乙個服務程式,那麼你可以指定這個服務程式執行時的程序id。gdb會自動attach上去,並除錯他。program應該在path環境變數中搜尋得到。
gdb啟動時,可以加上一些gdb的啟動開關,詳細的開關可以用gdb -help檢視。我在下面只例舉一些比較常用的引數:
-symbols
-s 從指定檔案中讀取符號表。
-se file
從指定檔案中讀取符號表資訊,並把他用在可執行檔案中。
-core
-c 除錯時core dump的core檔案。 //更詳細的關於core dump可自行在補充
-directory
-d 加入乙個原始檔的搜尋路徑。預設搜尋路徑是環境變數中path所定義的路徑。
GDB除錯程式 一
gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具,主要完成以下四個方面的內容 1.啟動程式,讓陳程式按照自己的定義隨心所欲的執行。2.可以放程式在指定的斷點處停住。3.當程式挺住時,可以檢查程式發生的事情。4.動態改變程式的執行環境。gdb使用流程 1.編譯可執行檔案 gcc g zj...
GDB除錯程式
gdb的三個功能 1 啟動被除錯的程式 2 設定斷點 3 設定斷點之後可以檢查程式的狀態 1.編譯生成可執行檔案 注意 g 除錯選項 gcc g tst.c o tst 2.啟動gdb gdb tst 3.在main函式處設定斷點 break main 4.執行程式 run5.利用 更加豐富的 gd...
gdb除錯程式
除錯是每個程式設計師都會面臨的問題.如何提高程式設計師的除錯效率,更好更快地定位程式中的問題從而加快程式開發的進度,是大家共同面對的問題.可能windows使用者順口就會說出 用vc唄 它提供了設定斷點,單步跟蹤等的圖形介面,使除錯起來直觀易用.但linux使用者可能要生悶氣了 o 難道我們linu...