標籤:style io 使用 ar for 檔案 資料 sp 問題
1,調試core dump 檔案
ulimit -c 1024:設定coredump檔案大小為1024,否則預設不會產生coredump檔案
gdb -c core:gdb調試該coredump檔案
file a.out:指定符號表檔案
bt:列印堆棧資訊
2,插入斷點:
b/break 15
b funcname
b filename::linenum
b 預設在下一條指令停止
b if a=100
3,退出gdb
q
quit
4,執行shell命令
shell clear
5,停止運行程式/恢複運行
斷點(breakpoint),觀察點(watchpoint),捕捉點(catchpoint),訊號(signal),線程停止(thread stops)
c/continue恢複運行
6,設定觀察點
watch <expr>
rwatch <expr> 當expr被讀時停止程式
awatch <expr> 當expr被讀或寫時停止程式
7,維護停止點
clear 清除所有停止點,只有在程式運行時才起作用
clear <function>
clear <linenum>
d/delete [breakpoints][range...] 刪除指定的斷點,breakpoints表示斷點號,range表示斷點號的範圍,如3-7
dis/disable [breakpoints][range...] 禁用指定的斷點
8,單步運行
c/fg/continue 恢複程式運行直到下一個斷點
step <count> 單步count次,如果有函數調用,進入該函數內部執行
next <count> 單步count次,如果有函數調用,不會進入該函數
finish 運行程式直到當前函數完成返回
u/until 運行程式直到完成當前迴圈體並返回
9,查看棧資訊
bt/backtrace 列印當前函數調用棧的所有資訊
bt <n> 列印棧頂上n層資訊
bt <-n> 列印棧低下n層資訊
f/frame <n> 一般來說,程式停止時,當前棧就是最頂層棧,f/frame 0表示列印0層,即棧頂資訊,n表示列印第n層棧資訊,列印資訊比bt豐富
up <n> 向棧的上面移動n層,如果沒有n,則表示移動一層
down <n> 向棧的下面移動n層,如果沒有n,則表示移動一層
info f/frame,列印更為詳細的資訊
info args 列印當前函數的參數名及值
info locals 列印當前函數中所有局部變數的值
info catch 列印當前函數中異常處理資訊
10,查看原始碼
list <linenum> 顯示程式第linenum行的周圍的來源程式
list <function> 顯示函數名為function的函數的來源程式
list 顯示當前行後面的來源程式
list - 顯示當前行前面的來源程式
一般是列印當前行的上5行和下5行,如果顯示函數是是上2行下8行,預設是10行,當然,你也可以定製顯示的範圍,使用下面命令可以設定一次顯示來源程式的行數
set listsize <count> 設定一次顯示原始碼的行數
show listsize 查看當前listsize的設定
list命令還有下面的用法:
list <first>, <last> 顯示從first行到last行之間的原始碼
list , <last> 顯示從當前行到last行之間的原始碼
list + 往後顯示原始碼
一般來說在list後面可以跟以下這們的參數:
<linenum> 行號
<+offset> 當前行號的正位移量
<-offset> 當前行號的負位移量
<filename:linenum> 哪個檔案的哪一行
<function> 函數名
<filename:function> 哪個檔案中的哪個函數
<*address> 程式運行時的語句在記憶體中的地址
11,搜尋原始碼
forward-search <regexp>
search <regexp> 向前面搜尋
reverse-search <regexp> 全部搜尋
12,原始碼在記憶體中的位置
info line <test.c:function>
info line <linenum>
13,查看原始碼的機器碼
disassemble function
14,查看運行時資料
p/print <expr>
p /<f> <expr> <f>是輸出的格式,如果設定十六進位輸出的話,就是/x
x 按十六進位格式顯示變數。
d 按十進位格式顯示變數。
u 按十六進位格式顯示無符號整型。
o 按八進位格式顯示變數。
t 按二進位格式顯示變數。
a 按十六進位格式顯示變數。
c 按字元格式設定顯示變數。
f 按浮點數格式顯示變數。
15,列印數組
int *array = (int *) malloc (len * sizeof (int));
p *[email protected] @左邊是數組地址,右邊是數組長度
16,自動顯示,即程式停止或單步跟蹤時,變數自動顯示
display <expr>
display /<fmt> <expr>
display /<fmt> <addr>
info display 列印設定的自動顯示的變數資訊
17,查看寄存器的值
info registers
info all-registers
info registers <regname...>
需要注意的是,如果你的程式編譯時間開啟了最佳化選項,那麼在用GDB調試被最佳化過的程式時,可能會發生某些變數不能訪問,或是取值錯誤碼的情況。這個是很正常的,因為最佳化程式會刪改你的程式,整理你程式的語句順序,剔除一些無意義的變數等,所以在GDB調試這種程式時,運行時的指令和你所編寫指令就有不一樣,也就會出現你所想象不到的結果。對付這種情況時,需要在編譯器時關閉編譯最佳化。一般來說,幾乎所有的編譯器都支援編譯最佳化的開關,例如,GNU的C/C++編譯器GCC,你可以使用“-gstabs”選項來解決這個問題。
gdb常用功能