簡介sass
GDB是一個功能強大的交互式程序調試工具,主要工做在字符界面下。函數
GDB不只能夠用來調試C/C++ 語言編寫的程序,還能夠用來調試 Pascal、Objective-C,以及Fortran等語言編寫的程序工具
GDB經常使用命令優化
GDB 調試器有不少命令,從簡單的文件載入、斷點設置到複雜的內存查看、信號捕捉等。spa
在使用GDB 調試程序以前,必須使用 -g 選項用gcc(或者g++)編譯源文件,以便將調試信息加入到要調試的程序之中,並且 gcc 的 -個選項不能和優化選項一塊兒使用命令行
GDB的基本命令包括GDB的啓動與退出、載入程序、列出源代碼、執行程序以及使用幫助功能等調試
1.GDB的啓動與退出blog
直接在命令行輸入gdb 就會進入gdb 的交互模式內存
在gdb的交互模式,使用 q 命令會退出 gdb作用域
2.載入程序
方式1:直接使用命令: gdb 可執行文件,例子:gdb test
方式2:使用 gdb 先進入gdb 的交互模式,而後在gdb 交互模式下使用 file 可執行文件(例子:file test)將要調試的可執行文件載入
3.列出源代碼
在載入程序以後,使用 list(或者使用簡寫形式 l)就會列出前十行代碼
再輸入 l(或list),就會列出緊接着的後十行代碼
l 3,5:列出第三到第五行的代碼
l 9:列出第九行以及它的上下五行代碼
4.執行程序
使用r(或者run)來直接運行載入的程序,若是程序中沒有設置斷點,那麼將一直執行程序;若是程序中存在斷點,那麼將會執行到第一個斷點所在的地方,而後停住
5.使用幫助功能
能夠在gdb 的交互模式下使用 help 命令列出命令的種類(好比 running、stack、status……)
若是在 help 後面加上某個種類的名稱,那麼將會列出這個種類下的全部的命令信息,好比 help running 將給出全部關於程序運行的命令
能夠直接在help 後跟命令的名稱,獲取這條命令的介紹,好比 help run 將獲取關於 run 的詳細介紹
斷點設置與管理
斷點設置即在調試的程序中設置斷點,斷點的管理包括查看斷點信息、刪除或禁用斷點等
1.設置斷點(break)
命令是break,或者簡寫爲 b
b 8:在第8行設置斷點,若是這個使用再用 r 運行程序,會發現程序會在第 8 行暫停
若是想要繼續運行,可使用 continue(或者c)繼續執行,也會在遇到斷點時暫停
b 函數名:是程序在遇到指定的函數時候暫停執行
b 8 if i>7:在第8行設置斷點,而且只有在當第8行的 i>7 爲真時纔會暫停
2.查看斷點信息(info break)
info break:顯示當前gdb 在調試程序中設置的全部斷點信息
3.刪除指定的斷點(d)
d 斷點號:或者是使用delete,指定斷點號的話將會刪除指定的那個斷點,若是不指定斷點號將會刪除全部斷點
4.刪除指定行上的斷點(clear)
clear 行號(或者一個範圍):刪除指定行上的斷點
5.禁用指定的斷點(disable)
disable 斷點號:暫時禁止指定的斷點號,若是不指定斷點號將會禁止全部斷點
6.恢復指定的斷點(enable)
enable 斷點號:使得用 disable禁止的斷點再次有效
7.設置觀察點(watch)
在程序的調試過程當中,常常須要定位某個變量被改動的位置。
使用觀察點用來檢測某個變量或者表達式的值是否有變化,若是有變化則暫停程序的運行
watch 變量名(或者表達式的名稱):watch設置觀察點必須是在程序的運行過程當中設置的,也就是在運行run 命令以後進行設置
數據顯示與變量賦值
上面介紹斷點的應用,可是若是隻有斷點是用處不大的,要跟蹤程序的運行,必須可以在斷點處查看或修改變量的值
下面的介紹是以這個源碼爲例的(test.c)
#include<stdio.h> int main() { int i; int sum = 0; for(i=1; i<=10; i++) { sum += i; } printf("1+2+...+10=%d\n", sum); return 0; }
1.顯示變量或表達式的值(print或者p)
1.編譯程序(必定要使用 -g 選項):gcc -g -o test test.c
2.使用 gdb test 載入要調試的文件(下面的命令都是在 gdb的交互模式下執行的)
3.b 8,在第八行設置斷點
4.r,運行程序,在第八行暫停
5.p sum,顯示此時 sum的值,此時sum的值爲0
或者使用 p/x sum,使用 16進制形式輸出 sum的值
6.使用 c 命令繼續執行,第二次循環又在 第8行暫停
7.p sum,顯示此時上的sum 值爲 1(...依次循環)
p 以後的變量必須是全局變量,或者是在這個做用域有效的局部變量,若是全局變量和局部變量重名,那麼局部變量會隱藏全局變量,若是此時像查看 全局變量的值,使用 :: 操做符
2.自動顯示變量或表達式的值(display)
使用該命令以後,每當程序運行到斷點處,就會自動顯示以前設置過得變量或表達式
一、二、三、4同上,此時暫停執行
5.display sum:設置自動顯示sum
6.c :繼續執行,而且自動在第二次循環執行到第8行時又暫停,此時會自動顯示 sum 的值,而不用再去使用 p sum 了
3.顯示變量的數據類型(whatis、ptype)
一、二、三、4同上,此時暫停執行
5.使用 whatis sum,或者 ptype sum,將會顯示:type = int,就是sum的數據類型的 int
4.修改變量的值(set)
一、二、三、4同上,此時暫停執行
5.set sum=100,設置此時的sum 爲100,而後下面的運行就會在sum=100基礎上執行
6.c ,繼續執行,而且自動在第二次循環執行到第8行時又暫停,用 p sum,能夠看到sum的值爲101(第一次循環是sum+=i; i爲1)
7.c ,繼續執行,而且自動在第二次循環執行到第8行時又暫停,用 p sum,能夠看到sum的值爲103(第一次循環是sum+=i; i爲2)
程序執行與函數調用
上面已經介紹了 run和continue,下面介紹其餘的
1.單步執行(step、next)
step能夠簡寫爲s;next能夠簡寫爲 n
step:執行到函數調用的地方,會跟蹤進入函數內部(而且會給出提示信息:被調用函數的入口地址、行號……)
next:執行到函數調用的地方,並不會跟蹤進入函數內部,而是直接將函數調用看作是一個語句,直接執行過去
2.退出被調用的函數(return)
step 能夠跟蹤進入被調用函數的內部,可是若是想要退出被調用函數,則可使用 return 命令
3.執行到指定行(until 行號)
使用until 的前提是從當前行到指定行之間沒有斷點,不然會在第一個斷點處暫停
4.跳轉執行(jump)
通常狀況下,程序會按照程序代碼的順序執行,可是若是想要更改程序的運行順序,可使用 jump
5.強制調用函數(call)
其餘調試命令
1.查看堆棧信息(backtrace、frame)
2.查看源程序信息(info source)
3.查看寄存器(info registers)
4.查看程序的彙編代碼(disassemble)