調試策略:使用二分法定位問題,打斷點,而後按行執行觀察數組
斷點(b)和繼續執行(c)指令函數
指令 b 能夠在須要地方放置斷點,使得程序在指令的位置中止運行,指令格式爲 b 斷點位置。其中,斷點位置能夠是行號,也能夠是函數名(指定方式與 l 指令相似),也能夠是地址。ui
b 10 //在源代碼10行處放置斷點spa
b main //在main函數開始處放置斷點.net
b *0x80480000 //在存放在0x80480000處的指令處放置斷點,直接使用地址時須要使用 *地址 的格式 指針
b 10 if a<10 //能夠在斷點中加入中斷執行的條件,表示當a < 10 時纔會中斷程序執行調試
linenum 本地行號,即list命令可見的行號對象
filename:linenum 制定個文件的行號blog
function 函數,能夠是自定義函數也但是庫函數,如open進程
filename:function 制定文件中的函數
condtion 條件
在斷點處檢查完畢後,可使用 c 指定繼續指令的執行。使用指令 disable/enable 斷點號 能夠啓用/停用某斷點。使用指令 d 可刪除全部的斷點,d 1 刪除breakpoint 1.
顯示(disp)和打印(p)指令
disp指令(display)能夠在每次程序暫定時顯示指定變量的值,指令格式爲 disp 變量名。若輸入的變量爲數組名,則每次顯示數組的全部元素,若爲結構體,則輸出結構體的全部成員的值。
disp temp //在每次程序暫停時輸出指定的變量的值(確保程序在指定變量的做用域內執行,如某個在特定函數中的局部變量在程序進入該函數執行以前是沒法被顯示的)
undisplay //取消全部disp指定的自動顯示變量
p指定(print)一樣將變量的值打印出來,用法與diap相似,但結果只顯示一次。
除變量外,p指令還能夠輸出給定寄存器、給定地址處的值。同時,能夠經過一些參數對打印格式進行規定,如 /x 表示以16進制格式打印值,/t表示以二進制格式打印值。
p $eax //打印寄存器%eax存儲的值,注意使用$標誌寄存器名稱
p /x ($ebp + 8) //以十六進制的格式打印%ebp + 8 的值
p /t 100 //以二進制格式輸出100的值
p *0x08048000 //輸出位於0x08048000處的數據(此處實際存放的是機器代碼),注意地址需使用 * 標誌,不然會被默認爲常數
p *(int *)0xxxxxxxx //將指定地址處數據按照整數格式輸出,這裏通常須要指出指針類型方便gdb解釋數據
其餘顯示類
info reg //輸出全部寄存器的當前值
info frame //輸出棧幀的使用狀況
x 指令用於檢查內存中某一區域的值,指令格式爲 :x fmt address 。其中address爲內存地址的表達式,fmt由 /重複次數+格式化字符+尺寸字符 組成。格式化字符有o(octal,八進制),x(hex,十六進制), d(decimal,十進制),u(unsigned decimal,無符號十進制),t(binary,二進制),f(float,浮點),a(address,地址),i(instruction,指令),c(char,字符),s(string,字符串).尺寸字符有 b(byte),h(halfword), w(word), g(giant, 8 bytes)
例:
x /4xb *0xxxxxx //將指定地址區域連續的四個字節以十六進制的格式輸出,通常內存地址均使用 * 標識。
該指令的使用方法與C語言中的格式化輸出函數類似
printf" %d , %d \n",X,Y //對於兩個變量整形X,Y進行輸出
使用指令whatis能夠方便的得知所需對象的類型,如 whatis temp 會顯示出temp的類型定義,在調試時有用。
s 與 n 指令都是表示執行下一條指令指令的意思。可是,當遇到函數調用時,s 指令會進入函數調用內部進行執行,即下一步爲被調函數的第一指令,而 n 指令不進入函數調用內部,會將整個函數的執行過程看成一步執行。
回溯指令(backtrace)能夠查看程序內存訪問越界等錯誤信息,顯示程序出錯的位置,從而幫助定位程序錯誤。
info args
Print the arguments of the selected frame, each on a separate line.
info locals
打印出當前函數中全部局部變量及其值。
info catch
打印出當前的函數中的異常處理信息。
設置指令 set 能夠將指定的變量的值修改成調試所須要的值。如對於一個int型的變量X,可使用 set X = 12 將變量的值進行設置。
可使用宏定義對一些經常使用指令進行定義。指令格式 :define 宏名,並根據提示輸入宏定義,以end做爲結尾標誌。
gdb [exec file] [core file]
ulimit -c 能夠設置core的文件,並能控制是否產生core文件,若是設置爲0的話,將不產生core文件,若是設置的大小小於core文件,則對core文件截取.
打開core文件的限制,不限制core文件的大小,使程序能夠產生core文件
ulimit -c unlimited
ulimit -c
/proc/sys/kernel/core_uses_pid能夠控制core文件的文件名中是否添加pid做爲擴展.文件內容爲1,表示添加pid做爲擴展名,生成的core文件格式爲core.PID,爲0則表示生成的core文件統一命名爲core.
/proc/sys/kernel/core_pattern能夠控制core文件保存位置和文件名格式,以下:
echo "/tmp/core-%e-%u-%s" > /proc/sys/kernel/core_pattern
%e表示添加命令名
%u表示添加當前uid
%s表示添加致使產生core的信號
強制生成core文件
第一種是發送信號給進程,以下:
kill -s SIGSEGV $$
而後編譯連接運行,使用pprof生成分析結果 g++-o demo demo.cpp -lprofiler 運行demo,生成my.prof文件,而後用pprof命令對該文件解析,生成結果txt或pdf等。 pprof–text ./demo my.prof > output.txt pprof–pdf ./demo my.prof > output.pdf