1 、基本命令
1.1 啓動和退出GDB
[root@localhost ~]#gdb test
啓動GDB調試test程序
[root@localhost ~]#gdb programe 2146
啓動GDB調試進程號爲2146的進程
[root@localhost ~]# gdb
(gdb) attach 2146
啓動GDB掛載到進程號爲2146的進程上開始調試
(gdb)detach 2146
釋放進程號爲2146的進程,終止調試
(gdb)set args –a –b123 -c
(gdb)show args
設置和查看被調試程序的啓動參數
(gdb)run
(gdb)kill
啓動和停止當前被調試程序,run命令也可跟參數
(gdb)quit
終止調式,退出GDB
1.2 查看源代碼
(gdb)list 123
查看當前源代碼文件中123行及其前後5行的代碼
(gdb)list abc.cpp : 123
查看源文件abc.cpp中123行及其前後5行的代碼
(gdb)list foo
查看函數foo起始行及其前後5行的代碼
(gdb)list abc.cpp : foo
查看源文件abc.cpp中函數foo起始行及其前後5行的代碼
(gdb)list 0xabcd1234
查看包含0xabcd1234地址的代碼行及其前後5行的代碼
2 流程控制
(gdb)s
單步執行
(gdb)n
單步執行,但不展開函數調用
(gdb)c
繼續執行
(gdb)u
執行至循環結束
(gdb)u 123
執行至123行
(gdb)finish
跳出當前函數
(gdb)bt
查看當前函數調用堆棧
(gdb)frame 3
跳轉到函數堆棧中索引爲3的函數上下文
3 查看數據3.1 GDB的數據顯示格式
x 按十六進制顯示
d 按十進制顯示
u 顯示32位無符號整型。
o 按八進制顯示
t 按二進制顯示
a 按地址顯示
c 按字符顯示
f 按浮點數顯示
s 按字符串顯示
3.2 查看變量和數組
(gdb)p foo
查看變量foo的值
(gdb)p *bar
查看指針bar所指對象內容
(gdb)p/x foo
按十六進制查看變量foo的值
(gdb)p bar@10
查看數組bar的10個元素
(gdb)ptype foo
查看foo的類型定義
3.3 查看內存內容
x命令格式:x/[count][format][size] address
size可以是b(byte), h(halfword), w(word), g(giant, 8 bytes)
(gdb)x/10ub ptr
按無符號整形從ptr所指地址開始輸出10字節
(gdb)x/5xw ptr
按16進制從ptr所指地址開始輸出5個字(10字節)
4 斷點4.1 設置斷點
(gdb)b 123
在當前源文件的123行設置斷點
(gdb)b abc.cpp : 123
在源文件abc.cpp的123行設置斷點
(gdb)b foo
在全局函數foo設置斷點
(gdb)b foo::bar
在類foo的成員函數bar設置斷點
(gdb)b ns::foo::bar
在命名空間ns中的類foo的成員函數bar設置斷點
(gdb)b 123 if foo == 1 && bar == 0
在當前源文件123行設置斷點,並且當foo等於1且bar等於0時才命中
4.2 管理斷點
(gdb)info b
查看所有斷點信息
(gdb)d
刪除所有斷點
(gdb)d 2
刪除2號斷點
(gdb)enable 1
打開1號斷點
(gdb)disable 5
禁用5號斷點
5 多線程
(gdb)info threads
查看線程表
(gdb)thread 2
切換到線程表中索引爲2的線程
(gdb)b foo 2
在函數foo設置斷點,並且只在索引爲2的線程中命中
(gdb)set follow-fork-mode parent
當fork調用發生時,繼續調試父進程
(gdb)set follow-fork-mode child
當fork調用發生時,繼續調試子進程