gdb除錯程式 列子

2021-07-07 07:05:43 字數 3415 閱讀 6444

一、問題:

二、解決:

你用file +可執行程式名  看一下,結果是啥

有可能是乙個指令碼檔案,二進位制檔案在隱藏目錄下,找到真正的二進位制檔案除錯

三、實驗:

用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         

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         

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       

$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    

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檔案。

-directory

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

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...

GDB除錯程式

gdb是gnu發布的一款功能強大的程式除錯工具。主要功能 1.啟動被除錯程式。2.讓被除錯程式在指定位置停住。3.當程式被停止時,可以檢查程式狀態 如變數值 編譯生成可執行程式一定要加 g選項 gcc g test.c o test 啟動gdb gdb 可執行程式名 gdb test 在main函式...