用gdb偵錯工具時,常常很困惑一些命令的使用,要麼是不知道這個命令,要麼忘了命令的使用方法。
呵呵,有時迷茫了自己處在什麼堆棧的深處,這是使用where命令能夠清晰的看到自己的位置,有時在迴圈太多讓人受不了了,可使用u或者finish或者jump命令來跳出去。
gdb常用:
run 啟動程式運行
next 逐步執行(不到函數內部)
step 逐步執行,跟蹤到函數內部
finish 繼續執行,直到當前函數結束
continue 繼續執行,直到下一個斷點
jump 9 直接跳到指定行
list 顯示源碼
l 3,10 顯示特定範圍的源碼 l main顯示函數的源碼
set listsize 50 修改源碼顯示行數
break 設定斷點
b main設定函數斷點
b 9 設定指定行斷點
b 將下一行設定為斷點
b test if a == 10 設定條件斷點
delete 刪除斷點
d 3 刪除指定的斷點
condition 修改條件 condition 4 a == 90
info 查看資訊
info threads 查看線程資訊
info breakpoints 查看斷點資訊
info locals 顯示局部變數
info args 顯示函數變數
info registers 顯示寄存器資料
thread 2 切換線程
where 查看呼叫堆疊(bt 或者 info s)
frame 查看當前堆疊框架
frame 8 查看指定堆疊框架資訊
info frame 查看當前堆疊框架更詳細的資訊
print a 列印變數資訊
print/x a 十六進位輸出變數資訊
print a + b 可以進行運算式計算
print $eax 顯示某個寄存器的資料
x/nfu 0×300098 顯示指定地址的記憶體資料
n 顯示記憶體單位,長度
f 格式(除了 print 格式外,還有 字串s 和 彙編 i)
u 記憶體單位(b: 1位元組; h: 2位元組; w: 4位元組; g: 8位元組)
set vairiable a = 100 可以修改變數的值
commands 指定到了特定斷點後執行的命令序列
whatis buf 顯示變數的類型
dump memory 輸出檔案名 記憶體起始地址 記憶體終止地址
restore 檔案名稱 binary 起始位置
watch buf buf的值一旦改變,會觸發watchpoint
奇淫技巧:
cat ~/.gbinit gdb會從這個檔案讀取配置
cat ~/.gdb_history
呵呵,對於gdb時想要查看長的字串老是顯示不全,怎麼半呢,gdb參看數組字串時預設只是顯示部分的資料,通過這個命令可以修改:
set print elements 0 預設這裡設定是200,設定為0表示沒有限制
還有其它一些set命令可以試試:
set print address
set print address on
開啟地址輸出,當程式顯示函數資訊時,GDB會顯出函數的參數地址。系統預設為開啟的
set print object <on/off>
在C++中,如果一個對象指標指向其衍生類別,如果開啟這個選項,GDB會自動按照虛方法調用的規則顯示輸出,如果關閉這個選項的話,GDB就不管虛函數表了。這個選項預設是off
show print pretty
查看GDB是如何顯示結構體的
set print array
set print array on
開啟數組顯示,開啟後當數組顯示時,每個元素佔一行,如果不開啟的話,每個元素則以逗號分隔。這個選項預設是關閉的
set print null-stop <on/off>
如果開啟了這個選項,那麼當顯示字串時,遇到結束符則停止顯示。這個選項預設為off
set print pretty on
如果開啟printf pretty這個選項,那麼當GDB顯示結構體時會比較漂亮
set print union <on/off>
設定顯示結構體時,是否顯式其內的聯合體資料。例如有以下資料結構
p string+n顯示位移n後的字串內容,這個使用起來也是比較方便的