常用的GDB調試指令
時間:2023-09-09 來源:華清遠見
什么是GDB調試?
GDB 全稱“GNU symbolic debugger”,從名稱上不難看出,它誕生于 GNU 計劃(同時誕生的還有 GCC、Emacs 等),是 Linux 下常用的程序調試器。發展至今,GDB 已經迭代了諸多個版本,當下的 GDB 支持調試多種編程語言編寫的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。實際場景中,GDB 更常用來調試 C 和 C++ 程序。
GDB調試有什么作用?
a) 啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
b) 在某個指定的地方或條件下暫停程序。
c) 當程序被停住時,可以檢查此時你的程序中所發生的事。
d) 在程序執行過程中修改程序中的變量或條件,將一個bug產生的影響修正從而測試其他bug。
使用GDB調試注意事項
1.要使用GDB調試某個程序,該程序編譯時必須加上編譯選項 -g,否則該程序是不包含調試信息的;
2.GCC編譯器支持 -O 和 -g 一起參與編譯。GCC編譯過程對進行優化的程度可分為5個等級,分別為 :
-O/-O0: 不做任何優化,這是默認的編譯選項 ;
-O1:使用能減少目標文件大小以及執行時間并且不會使編譯時間明顯增加的優化。 該模式在編譯大型程序的時候會花費更多的時間和內存。在 -O1下:編譯會嘗試減少代 碼體積和代碼運行時間,但是并不執行會花費大量時間的優化操作。
-O2:包含 -O1的優化并增加了不需要在目標文件大小和執行速度上進行折衷的優化。 GCC執行幾乎所有支持的操作但不包括空間和速度之間權衡的優化,編譯器不執行循環 展開以及函數內聯。這是推薦的優化等級,除非你有特殊的需求。 -O2會比 -O1啟用多 一些標記。與 -O1比較該優化 -O2將會花費更多的編譯時間當然也會生成性能更好的代 碼。
-O3:打開所有 -O2的優化選項并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize優化選項。這是最高最危險 的優化等級。用這個選項會延長編譯代碼的時間,并且在使用 gcc4.x的系統里不應全局 啟用。自從 3.x版本以來 gcc的行為已經有了極大地改變。在 3.x,,-O3生成的代碼也只 是比 -O2快一點點而已,而 gcc4.x中還未必更快。用 -O3來編譯所有的 軟件包將產生更 大體積更耗內存的二進制文件,大大增加編譯失敗的機會或不可預知的程序行為(包括 錯誤)。這樣做將得不償失,記住過猶不及。在 gcc 4.x.中使用 -O3是不推薦的。
-Os:專門優化目標文件大小 ,執行所有的不增加目標文件大小的 -O2優化選項。同時 -Os還會執行更加優化程序空間的選項。這對于磁盤空間極其緊張或者 CPU緩存較小的 機器非常有用。但也可能產生些許問題,因此軟件樹中的大部分 ebuild都過濾掉這個等 級的優化。使用 -Os是不推薦的。
GDB調試指令
0.啟動gdb調試
gdb filename : 啟動未啟動程序進行調試(需要run)
gdb attach pid:對已經啟動的程序調試, detach讓gdb調試器與程序分離
gdb corename: 調試core文件
ulimit -c查看core文件生成功能是否開始(ulimit -a查看ulimit其他功能參數)
在/proc/sys/kernel/core_uses_pid內控制core文件的文件名是否加入pid作為擴展,若添加,文件內容為1,否則0
1.run -> r
gdb filename只是attach到一個調試文件,run啟動程序
ctrl+c中斷后,run重啟
2.continue -> c
ctrl +c中斷后,使用continue讓程序繼續運行,會在斷點處中斷
3.break -> b
添加永久斷點, 可以接行數(一般是list出的代碼對應的行數) 或者 函數名
4.tbreak
臨時斷點,重啟程序后消失
5.backtrace -> bt
查看當前線程的調用堆棧
6.frame -> f
與backtrace結合使用,切換不同堆棧
7.info break -> info b
查看設置的斷點信息
disable 斷點編號 : 禁用斷點編號對應斷點
enable 斷點編號 : 重新開啟對應斷點
delete 斷點編號 : 刪除對應斷點
如果上述不加斷點編號 => 禁用/啟用/刪除 所有斷點
8.list -> l
list + : 當前位置向結尾10行
list - : 當前位置向上10行
9.print -> p
查看變量的值,或者 修改內存中的變量值
可以p func() 得到函數執行結果
可指定輸出格式p /format var 如十六進制顯示var p /x var
ptype : 輸出變量類型
10.info threads
查看當前進程的所有線程的運行情況。*號表示當前gdb作用在哪一個線程
thread 切換不同線程
11.info args
查看當前函數的參數值
12.next -> n
單步步過,遇到函數調用直接跳過,不會執行
13.step -> s
單步步入 遇到函數調用會進入函數內部
14.finish
直接執行完當前函數,返回調用處
15.return
直接結束當前函數,返回調用處(可以指定返回值)
16.until -> u
快速執行并跳到指定行
17.jump
可以跳到指定行或函數,中間的被略過,如果指定位置沒有斷點,繼續執行
18.disassemble
輸出當前函數的匯編指令
默認為AT&T格式,set disassembly-flavor intel更改為intel匯編格式
19.set args
在gdb attach之后,run之前,使用set args 指定被調試程序的命令行參數(多個參數用""括住,空格隔開), show args 查看當前設置的命令行參數
20.watch
監視一個變量活著一段內存, 當發生變化時,gdb就會中斷.
21.display
監視變量或者內存的值,每次gdb中斷,就自動輸出這些值
info display查看當前已經監視了哪些值
delete display 編號 : 移除對指定變量的監視
22.多線程調試:
set scheduler-locking on : 鎖定當前線程,其他線程暫停運行
set scheduler-locking step: 鎖定next、step操作目標為當前線程
set scheduler-locking off : 取消鎖定

