Linux下GDB除錯程式

2021-08-18 14:25:46 字數 3742 閱讀 6071

gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc、bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc、bcb的圖形化偵錯程式更強大的功能。所謂「寸有所長,尺有所短」就是這個道理。

一般來說,gdb主要幫忙你完成下面四個方面的功能:

啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。

可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)

當程式被停住時,可以檢查此時你的程式中所發生的事。

動態的改變你程式的執行環境。

除錯指令:

gdb+a.out

l :從main函式開始開始

l + 行號

l + 函式名

b + 行號:設斷點

b + 函式名

i b:檢視斷點資訊

r:執行(有斷點則在第乙個斷點處停下來)

n:單步向下執行

s:單步執行,且可以進入函式

print +內容:列印內容

whatis +內容:檢視該內容的型別

d +編號:刪除編號處(不是行號)的斷點。

b +行號 if i==9:設定條件斷點

finish:執行到當前函式返回處(退出函式)

bt:列印棧幀關係

先寫乙個簡單程式來除錯一把:

#include

int add(int a,int b)

int main()

除錯過程:

[root@localhost gdbtmp]# ls

tmp tmp.c

[root@localhost gdbtmp]# gdb tmp //啟動除錯

gnu gdb (gdb) red hat enterprise linux (7.2-92.el6)

license gplv3+: gnu gpl version 3

or later .org/licenses/gpl.html>

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law. type "show copying"

and"show warranty" for details.

this gdb was configured as "i686-redhat-linux-gnu".

for bug reporting instructions, please see:

.gnu

.org/software/gdb/bugs/>...

reading symbols from /home/centos/code/gdbtmp/tmp...done.

(gdb) b 5 //設定斷點,在源程式第5行處。

breakpoint 1 at 0x80483ca: file tmp.c, line 5.

(gdb) b 10//設定斷點,在源程式第10行處。

breakpoint 2 at 0x80483eb: file tmp.c, line 10.

(gdb) i b//檢視斷點資訊

num type disp enb address what

1 breakpoint keep y

0x080483ca

inadd at tmp.c:5

2 breakpoint keep y

0x080483eb

in main at tmp.c:10

(gdb) r //執行程式,run命令簡寫

starting program: /home/centos/code/gdbtmp/tmp

breakpoint 2, main () at tmp.c:13 //在斷點處停住。

13 int a = 10

;missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132

.el6.i686

(gdb) n //單條語句執行,next命令簡寫。

14 int b = 20

;(gdb) n //單條語句執行,next命令簡寫。

15 int ret = add(a,b);

(gdb) c //繼續執行程式,continue命令簡寫。

continuing.

breakpoint 1, add (a=10, b=20) at tmp.c:5

5 int ret = 0

;(gdb) n

6ret = a + b;

(gdb) p i

no symbol "i"

in current context.

(gdb) p a //列印變數a的值,print命令簡寫。

$1 = 10

(gdb) p ret

$2 = 0

(gdb) c //繼續執行程式,continue命令簡寫。

continuing.

ret = 30

program exited normally.

(gdb) q //退出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所定義的路徑。

linux下使用GDB除錯程式

現有一c原始檔 gdb 01.c 下面用gdb除錯該程式。gdb 01.c include static int sum int value int main int argc,char argv int input argv 1 0 int result sum input printf 你輸入的...

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