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