轉載於:孫老師在csdn
GDB, 又稱GNU調試器,是用來幫助調試我們程序的工具。
GDB可以幹以下幾件事:
1. 給程序設置(特定條件下的)斷點
2. 當程序停在斷點處時,我們查看所有變量、寄存器的值
3. 當程序停在斷點處時,我們除了能查看所有變量、寄存器的值以外,還能在不改變源代碼的情況下改變這些值(這個確實屌)
GDB命令總結
在我們學習使用GDB調試程序之前,我們先看看GDB有哪些命令。
命令 | 功能 |
---|---|
r | run, 直接調到斷點處,沒有設置斷點的話直接運行程序 |
b fun | 設置一個斷點breakpoint在函數”fun”的最開始 |
b N | 在當前運行源文件的第N行設置斷點 |
b file.c:N | 在當前源文件file.c的第N行設置斷點 |
d N | 刪掉delete第N行的斷點 |
info break | 顯示所有斷點信息 |
c | 繼續(continue)運行程序,一直到下一個斷點或程序結束 |
f | 運行直到當前函數(function)結束 |
s | 按step調試1行,會進入函數體 |
s N | 按step調試接下來的N行 |
n | 調試1行,與按s命令不同的是此處不進入函數體 |
p var | 輸出(print)變量”var”的值 |
set var=val | 設置變量”var”的值 |
bt | 打印調用堆棧(stack trace) |
q | 退出gdb |
GDB使用說明
GDB有如下兩種使用方式
1. 調試會崩潰、有邏輯錯誤的程序
2. 調試程序崩潰時自動生成的coredump
下面說明如何GDB調試
- 編譯並構建程序,加上調試選項-g,e.g. gcc -g main.cpp -o test.out
- 用GDB來運行程序,gdb test.out
- 使用GDB命令來分析、調試程序
- 退出GDB
下面將舉例說明GDB調試
源代碼
//main.c
#include <stdio.h>
int main()
{
int balance=100;
int target=1000;
float rate = 0.1;
int year = 0;
do
{
float interest = balance * rate;
balance = balance + interest;
year++;
} while ( balance >= target );
printf("%d No. of years to achieve target balance.\n", year);
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
一下爲詳細調試步驟
步驟1:編譯並構建程序,加上調試選項-g
gcc -g main.c -o test.out
步驟2:用GDB來運行程序
gdb test.out
步驟3:在main函數入口處設置一個斷點
b main
步驟4:運行程序
run
步驟5:使用step調試到13行
s
步驟6:查看balance, rate, interest的值
p balance
p rate
p interest
步驟7:使用step調試到15行
步驟8:查看balance, rate, interest的值(發現沒有循環,表明while條件出錯,應該是balance < target)
參考文章
GDB: The GNU Project Debugger
Debugging with GDB
GDB Tutorial