什么是調試?
所謂調試(Debug),就是讓代碼一步一步慢慢執行,跟蹤程序的運行過程。比如,可以讓程序停在某個地方,查看當前所有變量的值,或者內存中的數據;也可以讓程序一次只執行一條或者幾條語句,看看程序到底執行了哪些代碼。
在調試的過程中,我們可以監控程序的每一個細節,包括變量的值、函數的調用過程、內存中數據、寄存器、線程的調度等,從而發現隱藏的錯誤或者低效的代碼。
調試需要借助專業的輔助軟件——調試器(Debugger)。現在主流C/C++調試器有下面幾種:
1) Remote Debugger
Remote Debugger 是 VC/VS 自帶的調試器,與整個IDE無縫銜接,使用非常方便,初學者建議使用該調試器,本教程也以 VS2010 為例講解調試技巧。
2) WinDbg
大名鼎鼎的 Windows 下的調試器,它的功能甚至超越了 Remote Debugger,它還有一個命令行版本(cdb.exe),但是這個命令行版本的調試器指令比較復雜,不建議初學者使用。
3) LLDB
XCode 自帶的調試器,Mac OS X 下開發必備調試器。
4) GDB
Linux 下使用最多的一款調試器,也有 Windows 的移植版。
GDB 入門教程
下面給出一個具有buging.c
的程序:
#include <stdio.h> int getSum(int n) { int sum=0,i; for (i=1;i<=n;i++) sum+=i; return sum; } int main(){ int res=getSum(100); printf("1+2+...+100=%d\n",res); }
如果要調試程序,則在進行gcc
編譯的時候要加上-g
參數,gcc -g -o bugging bugging.c
。
1. 進入gdb
gdb bugging
gdb bugging -silent
選項-silent
用於屏蔽 GDB 的前導信息,否則它會在屏幕上打印一堆免責條款。
啟動 GDB 后,它輸出的信息表明已經讀入了 mian.out 的符號表。接下來,GDB 會顯示自己的提示符(gbd)
,提示並等待你輸入調試命令。
2. gdb -b 選項:設置斷點
設置斷點的命令是b
或者break
, 可以根據行號、函數名、地址來設置斷點位置。
b main b 10 b * 0x4004f4
3. gdb -r 選項:執行程序
一旦設置了斷點,下一步就是用r
或者run
命令執行被調試的程序,執行后會自動在第一個斷點處停下來:
可以用於 c/continue
繼續。
4. gdb -p 選項:打印變量的值
(gdb) p i $1 = 0 (gdb) p sum $2 = 140737488347344
可見,gdb還將值存起來並編號了,因此也可以用這個編號訪問:
(gdb) p $1 $3 = 0
5. gdb -n 選項:單步調試
調試命令n
或者next
用於繼續執行源文件中的下一行。
6. gdb -l 選項:列出源文件
可以通過不帶參數(默認展示10行)、行號、函數名
(gdb) list 2 (gdb) list main (gdb) list
7. 查看匯編
# 檢查匯編 會給出對應的代碼的匯編 disas # 查看寄存器內容 info registers # 打印指定寄存器 print $rsp # 每步執行 stepi # 檢查寄存器或某個地址 x/4wd $rsp
8. gdb -q 選項:退出調試
參考鏈接: