1.GDB 介紹
GDB(the GNU Project Debugger)是 GNU 發佈的一個功能強大的 UNIX 程序調試工具,可以調試 Ada、 C、 C++、 Objective-C 和 Pascal 等多種語言的程序,可以在大多數 UNIX 和Microsoft Windows 變種上運行。 GDB 既可以在本地調試,也可以進行遠程調試,這裏主要記錄本地調試的筆記,遠程調試將會在下一篇進行說明。
GDB 可以在命令行下啓動,通過命令行對程序進行調試; GDB 也有自己的圖形前端,如 DDD。無論通過何種方式啓動 GDB,通過 GDB 能夠對程序進行如下調試:
● 運行程序,還可以給程序加上某些參數,指定程序的行爲。
● 使程序在特定的條件下停止。
● 檢查程序停止時的運行狀態。
● 改變程序的參數,以糾正程序中的錯誤
2. GDB 基本命令
需要使用 GDB 調試的程序,在編譯的時候必須加-g 參數,開啓調試信息。運行 GDB,調試程序通常使用如下方式:
命令 | 功能描述 |
break | 設置斷點:break + 要設置斷點的行號 |
clear | 清除斷點:clear + 要清除斷點的行號 |
delete | 用於清除斷點和自動顯示的表達式的命令 |
disable | 讓所設斷點暫時失效 |
enable | 與disable相對 |
run | 運行調試程序 |
continute | 繼續執行正在調試的程序 |
next | 執行一行代碼,但不進入函數內部 |
step | 執行一行代碼,而且進入函數內部 |
list | 列出源代碼的一部分 |
print + 變量名:輸出該變量名的值 | |
watch | watch + 變量名:監視一個變量的值 |
quit | 退出 |
kill | 終止調試程序 |
3.GDB 調試範例
編寫hello_error.c,這裏取名error,是因爲這是一個bug的源文件
#include <stdio.h>
int *p = NULL;
void hello_print(void)
{
printf("hello world");
}
int main(int argc,char *argv[])
{
hello_print();
*p = 10;//error
return 0;
}
1.編譯輸出帶調試信息的可執行文件,這個文件通常會比一般情況下生成的可執行文件的大,因爲-g 輸出的文件是包含很多調試參數在裏面。
gcc -g hello_error.c -o hello_error1
gcc hello_error.c -o hello_error2
2.我們先運行一下hello_error1
./hello_error1
從調試信息中我們發現,出現內存段錯誤,原因是我們給指針p賦值,這個是指針是野指針,指向的是0地址,現在我們給0地址賦值,所以出現了錯誤。
我們使用gdb來調試這個程序:
gdb hello_error1
輸入help,可查看相應的幫助信息。
輸入 run 命令,開始調試程序
然後就停止在了錯誤的地方
我們也可以輸入where命令,來定位問題:
很明顯在源文件14行出現了問題
我們輸入list命令,查看下源文件代碼
我們先在13行打個斷點 break 13,然後輸入run,重新運行,然後程序就會運行到第13行,停止
然後輸入step,進入hello_print函數體,然後在輸入next,執行下一步,輸出hello world
打印輸出p
print p
給非法地址賦值,導致段錯誤