《用GDB除錯程式(二)》

2022-09-16 03:21:12 字數 4147 閱讀 6138

gdb的命令概貌

———————

啟動gdb後,就你被帶入gdb的除錯環境中,就可以使用gdb的命令開始除錯程式了,gdb的命令可以使用help命令來檢視,如下所示:

gdb的命令很多,gdb把之分成許多個種類。help命令只是例出gdb的命令種類,如果要看種類中的命令,可以使用help 命令,如:help breakpoints,檢視設定斷點的所有命令。也可以直接help 來檢視命令的幫助。

gdb中,輸入命令時,可以不用打全命令,只用打命令的前幾個字元就可以了,當然,命令的前幾個字元應該要標誌著乙個唯一的命令,在linux下,你可以敲擊兩次tab鍵來補齊命令的全稱,如果有重複的,那麼gdb會把其例出來。

示例一:在進入函式func時,設定乙個斷點。可以敲入break func,或是直接就是b func

(gdb) b func

breakpoint 1 at 0x8048458: file hello.c, line 10.

示例二:敲入b按兩次tab鍵,你會看到所有b打頭的命令:

(gdb) b

backtrace  break      bt

示例三:只記得函式的字首,可以這樣:

(gdb) b make_ 《按tab鍵》

(再按下一次tab鍵,你會看到:)

make_a_section_from_file

make_abs_section

make_blockvector

make_cleanup 

gdb把所有make開頭的函式全部例出來給你檢視。

示例四:除錯c++的程式時,有可以函式名一樣。如:

(gdb) b 'bubble( m-?

bubble(double,double)    bubble(int,int)

(gdb) b 'bubble(

你可以檢視到c++中的所有的過載函式及引數。(注:m-?和「按兩次tab鍵」是乙個意思)

要退出gdb時,只用發quit或命令簡稱q就行了。

gdb中執行unix的shell程式

在gdb環境中,你可以執行unix的shell的命令,使用gdb的shell命令來完成:

shell

呼叫unix的shell來執行,環境變數shell中定義的unix的shell將會被用來執行,如果shell沒有定義,那就使用unix的標準shell:/bin/sh。(在windows中使用command.com或cmd.exe)

還有乙個gdb命令是make:

make

可以在gdb中執行make命令來重新build自己的程式。這個命令等價於「shell make 」。

在gdb中執行程式

當以gdb 方式啟動gdb後,gdb會在path路徑和當前目錄中搜尋的原始檔。如要確認gdb是否讀到原始檔,可使用l或list命令,看看gdb是否能列出源**。

在gdb中,執行程式使用r或是run命令。程式的執行,你有可能需要設定下面四方面的事。

1、程式執行引數

set args 可指定執行時引數。(如:set args 10 20 30 40 50)

show args 命令可以檢視設定好的執行引數。

2、執行環境

path 可設定程式的執行路徑。

show paths 檢視程式的執行路徑。

set environment varname [=value] 設定環境變數。如:set env user=hchen

show environment [varname] 檢視環境變數。

3、工作目錄

cd 相當於shell的cd命令。

pwd 顯示當前的所在目錄。

4、程式的輸入輸出

info terminal 顯示你程式用到的終端的模式

使用重定向控制程式輸出。如:run > outfile

tty命令可以指寫輸入輸出的終端裝置。如:tty /dev/ttyb

除錯已執行的程式

兩種方法:

1、在unix下用ps檢視正在執行的程式的pid(程序id),然後用gdb pid格式掛接正在執行的程式。

2、先用gdb 關聯上源**,並進行gdb,在gdb中用attach命令來掛接程序的pid。並用detach來取消掛接的程序。

暫停 / 恢復程式執行

除錯程式中,暫停程式執行是必須的,gdb可以方便地暫停程式的執行。你可以設定程式的在哪行停住,在什麼條件下停住,在收到什麼訊號時停往等等。以便於你檢視執行時的變數,以及執行時的流程。

當程序被gdb停住時,你可以使用info program 來檢視程式的是否在執行,程序號,被暫停的原因。

在gdb中,我們可以有以下幾種暫停方式:斷點(breakpoint)、觀察點(watchpoint)、捕捉點(catchpoint)、訊號(signals)、執行緒停止(thread stops)。如果要恢復程式執行,可以使用c或是continue命令。

一、設定斷點(breakpoint)

我們用break命令來設定斷點。正面有幾點設定斷點的方法:

break

在進入指定函式時停住。c++中可以使用class::function或function(type,type)格式來指定函式名。

break

在指定行號停住。

break +offset

break -offset

在當前行號的前面或後面的offset行停住。offiset為自然數。

break filename:linenum

在原始檔filename的linenum行處停住。

break filename:function

在原始檔filename的function函式的入口處停住。

break *address

在程式執行的記憶體位址處停住。

break

break命令沒有引數時,表示在下一條指令處停住。

break ... if

...可以是上述的引數,condition表示條件,在條件成立時停住。比如在循環境體中,可以設定break if i=100,表示當i為100時停住程式。

檢視斷點時,可使用info命令,如下所示:(注:n表示斷點號)

info breakpoints [n]

info break [n]

二、設定觀察點(watchpoint)

觀察點一般來觀察某個表示式(變數也是一種表示式)的值是否有變化了,如果有變化,馬上停住程式。我們有下面的幾種方法來設定觀察點:

watch

為表示式(變數)expr設定乙個觀察點。一量表示式值有變化時,馬上停住程式。

rwatch

當表示式(變數)expr被讀時,停住程式。

awatch

當表示式(變數)的值被讀或被寫時,停住程式。

info watchpoints

列出當前所設定了的所有觀察點。

三、設定捕捉點(catchpoint)

catch

當event發生時,停住程式。event可以是下面的內容:

1、throw 乙個c++丟擲的異常。(throw為關鍵字)

2、catch 乙個c++捕捉到的異常。(catch為關鍵字)

3、exec 呼叫系統呼叫exec時。(exec為關鍵字,目前此功能只在hp-ux下有用)

4、fork 呼叫系統呼叫fork時。(fork為關鍵字,目前此功能只在hp-ux下有用)

5、vfork 呼叫系統呼叫vfork時。(vfork為關鍵字,目前此功能只在hp-ux下有用)

6、load 或 load 載入共享庫(動態鏈結庫)時。(load為關鍵字,目前此功能只在hp-ux下有用)

7、unload 或 unload 解除安裝共享庫(動態鏈結庫)時。(unload為關鍵字,目前此功能只在hp-ux下有用)

tcatch

只設定一次捕捉點,當程式停住以後,應點被自動刪除。

用gdb除錯程式(二)

變數的追蹤 struct people 假設有乙個陣列int a 10 使用命令 gdb p a 1 當時如果這個陣列是動態建立的,如int a int malloc 10 sizeof int 則會有不同 gdb p a 使用上面的命令只會輸出陣列中的第乙個元素,為了輸出整個輸出,可以使用下面的命...

用GDB除錯程式

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

用GDB除錯程式

七 設定顯示選項 gdb中關於顯示的選項比較多,這裡我只例舉大多數常用的選項。set print address set print address on 開啟位址輸出,當程式顯示函式資訊時,gdb會顯出函式的引數位址。系統預設為開啟的,如 gdb f 0 set quotes lq 0x34c78...