GDB除錯入門

2021-09-01 09:17:00 字數 3383 閱讀 8089

用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 {5         int sum=0,i;

6         for(i=0; i

編譯生成執行檔案:(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環境變數中搜尋得到。

-symbols

-s 從指定檔案中讀取符號表。

-se file

從指定檔案中讀取符號表資訊,並把他用在可執行檔案中。

-core

-c 除錯時core dump的core檔案。

-directory

-d 加入乙個原始檔的搜尋路徑。預設搜尋路徑是環境變數中path所定義的路徑。

->

GDB除錯入門

除錯符號 g 是在編譯的時候產生,而非鏈結的時候產生 所以 編譯成.o檔案時候,需要帶這個選項.1.執行命令 gdb 可執行檔案 如果不是 g選項編譯出來的,會直接告訴你,不能除錯 2.通過list標出檔案 多個原始檔可以是 list a.cpp 10 表示列出原始檔a.cpp的第十行 不指定行號,...

gdb除錯簡單入門

gdb 簡單入門 使用過程 1.生成程式檔案 gcc g main.cpp o helloworld 2.進入gdb除錯介面 gdb helloworld 3.斷點設定 新增斷點 命令 b break b main 函式名 b main.cpp 12 檔名 行號 b 12 行號 b object c...

gdb 除錯入門(二) 使用終端進行 gdb 除錯

在安裝完 gdb 後,就可以嘗試使用 gdb 在終端中除錯程式了,如果對安裝 gdb 存在疑惑,請參考 gdb 除錯入門 一 windows linux ubuntu 下安裝 gdb。首先編寫乙個簡單的helloworld.c include intmain 你也可以定位到你需要除錯的 c 程式,然...