Linux 包含了一個叫gdb 的GNU 調試程序。gdb 是一個用來調試C和C++程序的強力調試器。它使你能在程序運行時觀察程序的內部結構和內存的使用狀況。如下是 gdb 所提供的一些功能:它使你能監視你程序中變量的值、它使你能設置斷點以使程序在指定的代碼行上中止執行、它使你能一行行的執行你的代碼。在命令行上鍵入 gdb並按回車鍵就能夠運行gdb 了。(Windows須要安裝MinGW或者CygWin而且須要配置環境變量纔可使用)shell
啓動 GDB:express
l gdb executable數組
l gdb -e executable -c core-filesass
l gdb executable -pid process-id 函數
(使用命令 'ps -auxw' 能夠查看進程的 pid)優化
選項ui |
含義spa |
–help |
列出命令行參數。線程 |
–exec=file |
指定可執行文件。 |
–core=core-file |
指明 core 文件。 |
–command=file |
從指定文件中讀取 gdb 命令。 |
–directory=directory |
把指定目錄加入到源文件搜索路徑中。 |
–cd=directory |
以指定目錄做爲當前路徑來運行 gdb 。 |
–nx |
不要執行 .gdbinit 文件中的命令。默認狀況下,這個文件中的命令會在全部命令行參數處理完後被執行。 |
–batch |
在非交互模式下運行 gdb 。從文件中讀取命令,因此須要 -x 選項。 |
–symbols=file |
從指定文件中讀取符號表。 |
-write |
容許對可執行文件和 core 文件進行寫操做。 |
–quiet |
不要打印介紹和版權信息。 |
–tty=device |
指定 device 爲運行程序的標準輸入輸出。 |
–pid=process-id |
指定要附屬的進程 ID 。 |
GDB 中使用的命令:
命令 |
描述 |
help |
列出 gdb 幫助信息。 |
help topic |
列出相關話題中的 gdb 命令。 |
help command |
列出命令描述信息。 |
apropos search-word |
搜索相關的話題。 |
info args |
列出運行程序的命令行參數。 |
info breakpoints |
列出斷點。 |
info break |
列出斷點號。 |
info break breakpoint-number |
列出指定斷點的信息。 |
info watchpoints |
列出觀察點。 |
info registers |
列出使用的寄存器。 |
info threads |
列出當前的線程。 |
info set |
列出能夠設置的選項。 |
Break and Watch |
|
break funtion |
在指定的函數,或者行號處設置斷點。 |
break +offset |
在當前停留的地方前面或後面的幾行處設置斷點。 |
break file:func |
在指定的file文件中的func處設置斷點。 |
break file:nth |
在指定的file文件中的第nth行設置斷點。 |
break *address |
在指定的地址處設置斷點。通常在沒有源代碼時使用。 |
break line-number ifcondition |
若是條件知足,在指定位置設置斷點。 |
break line threadthread-number |
在指定的線程中中斷。使用info threads能夠顯示線程號。 |
tbreak |
設置臨時的斷點。中斷一次後斷點會被刪除。 |
watch condition |
當條件知足時設置觀察點。 |
clear |
清除函數func處的斷點。 |
delete |
刪除全部的斷點或觀察點。 |
delete breakpoint-number |
刪除指定的斷點,觀察點。 |
disable breakpoint-number-or-range |
不刪除斷點,僅僅把它設置爲無效,或有效。 |
enable oncebreakpoint-number |
設置指定斷點有效,當到達斷點時置爲無效。 |
enable del breakpoint-number |
設置指定斷點有效,當到達斷點時刪除它。 |
finish |
繼續執行到函數結束。 |
Line Execution |
|
step |
進入下一行代碼的執行,會進入函數內部。 |
next |
執行下一行代碼。但不會進入函數內部。 |
until until line-number ifcondition |
繼續運行直到到達指定行號,或者函數,地址等。 |
return |
彈出選中的棧幀(stack frame)。若是後面指定參數,則返回表達式的值。 |
stepi |
執行下一條彙編/CPU指令。 |
info signals |
當收到信號時執行下列動做:nostop(不要中止程序),stop(中止程序執行),print(顯示信號),noprint(不顯示),pass/noignore(容許程序處理信號),nopass/ignore(不讓程序接受信號) |
where |
顯示當前的行號和所處的函數。 |
Program Stack |
|
backtrace |
顯示當前堆棧的追蹤,當前所在的函數。 |
backtrace full |
打印全部局部變量的值。 |
frame number |
選擇指定的棧幀。 |
up number |
向上或向下移動指定個數的棧幀。 |
info frame addr |
描述選中的棧幀。 |
info args |
顯示選中棧幀的參數,局部變量,異常處理函數。all-reg也會列出浮點寄存器。 |
Source Code |
|
list |
列出相應的源代碼。 |
set listsize count |
設置list命令打印源代碼時的行數。 |
directory directory-name |
在源代碼路徑前添加指定的目錄。 |
directory |
當後面沒有參數時,清除源代碼目錄。 |
Examine Variables |
|
print variable |
打印指定變量的值。 |
p *array-var@length |
打印arrary-var中的前length項。 |
p/x var |
以十六進制打印整數變量var。 |
p/d var |
把變量var看成有符號整數打印。 |
p/u var |
把變量var做爲無符號整數打印。 |
p/o var |
把變量var做爲八進制數打印。 |
p/t var |
以整數二進制的形式打印var變量的值。 |
p/c variable |
當字符打印。 |
p/f variable |
以浮點數格式打印變量var。 |
p/a variable |
打印十六進制形式的地址。 |
x/w address |
打印指定的地址,以四字節一組的方式。 |
call expression |
相似於print,但不打印 void 。 |
disassem addr |
對指定地址中的指令進行反彙編。 |
Controlling GDB |
|
set gdb-option value |
設置 GDB 的選項。 |
set print array on |
以可讀形式打印數組。默認是 off 。 |
set print array-indexes on |
打印數組元素的下標。默認是 off 。 |
set print pretty on |
格式化打印 C 結構體的輸出。 |
set print union on |
打印 C 中的聯合體。默認是 on 。 |
set print demangle on |
控制 C++ 中名字的打印。默認是 on 。 |
Working Files |
|
info files |
列出當前的文件,共享庫。 |
file file |
把file看成調試的程序。若是沒指定參數,丟棄。 |
core file |
把file看成 core 文件。若是沒指定參數,則丟棄。 |
exec file |
把file看成執行程序。若是沒指定參數,則丟棄。 |
symbol file |
從file中讀取符號表。若是沒指定參數,則丟棄。 |
load file |
動態鏈入file文件,並讀取它的符號表。 |
path directory |
把目錄directory加入到搜索可執行文件和符號文件的路徑中。 |
Start and Stop |
|
run |
從頭開始執行程序,也容許進行重定向。 |
continue |
繼續執行直到下一個斷點或觀察點。 |
continue number |
繼續執行,但會忽略當前的斷點number次。當斷點在循環中時很是有用。 |
kill |
中止程序執行。 |
quit |
退出 GDB 調試器。 |
l 在編譯可執行文件時須要給 gcc 加上 "-g" 選項,這樣它纔會爲生成的可執行文件加入額外的調試信息。
l 不要使用編譯器的優化選項,好比: "-O","-O2"。由於編譯器會爲了優化而改變程序流程,那樣不利於調試。
l 在 GDB 中執行 shell 命令可使用:shell command
l GDB 命令可使用 TAB 鍵來補全。按兩次 TAB 鍵能夠看到全部可能的匹配。
l GDB 命令縮寫:例如 info bre 中的 bre 至關於 breakpoints。
GDB 在 Emacs 中的操做:
emacs 按鍵 |
動做 |
M-x gdb |
切換到 gdb 模式。 |
C-h m |
顯示 gdb 模式介紹信息。 |
M-s |
等同於gdb 中的 step 命令。 |
M-n |
等同於gdb 中的 next 命令。 |
M-i |
等同於gdb 中的 stepi 命令。 |
C-c C-f |
等同於gdb 中的 finish 命令。 |
M-c |
等同於gdb 中的 continue 命令。 |
M-u |
等同於gdb 中的 up 命令。 |
M-d |
等同於gdb 中的 down 命令。 |