linux下GDB調試

轉自 : http://532883775.blog.51cto.com/5481032/1320524

首先,程序編譯後如果要加上gdb調試信息,要加上編譯選項-g,如:gcc -g test.c -o test

載入到gdb:執行gdb test。或者直接gdb,進入gdb後,執行file test,樣的效果。

常用命令:

list(l):查看載入程序

break(b):設置斷點,如:在main函數處設置斷點:break main;break 行號,在制定行添加斷點;break 文件名:行號,在指定文件的指定行添加斷點;break 行號 if 條件 當條件問真時,指定行號處斷點生效,例:b 5 if i=10,當i等於10時第5行斷點生效。

info break: 查看所有設置的斷點

delete 斷點編號:刪除斷點

run(r):運行程序。

next(n):單步運行程序(不進入子函數)

step(s):單步運行程序(進入子函數)

continue(c):繼續運行程序

print(p)變量名:查看指定變量值

finish 運行程序,直到當前函數結束

watch 變量名:對指定變量進行監控

quit(q):推出gdb


gdb調試程序的時候打印變量值會出現<value optimized out> 情況,

可以在gcc編譯的時候加上 -O0參數項,意思是不進行編譯優化,調試的時候就會順暢了,運行流程不會跳來跳去的,

發佈項目的時候記得不要在使用 -O0參數項,gcc 默認編譯或加上-O2優化編譯會提高程序運行速度. 




轉自: http://www.360doc.com/content/11/0121/16/1964482_88118508.shtml

用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後的字符串內容,這個使用起來也是比較方便的


多進程下的跟蹤調試:

http://www.cnblogs.com/zhenjing/archive/2011/06/01/2065693.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章