GDB本地調試

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,調試程序通常使用如下方式:
 

GDB 常用的基本命令
命令 功能描述
break 設置斷點:break + 要設置斷點的行號
clear 清除斷點:clear + 要清除斷點的行號
delete 用於清除斷點和自動顯示的表達式的命令
disable 讓所設斷點暫時失效
enable 與disable相對
run 運行調試程序
continute 繼續執行正在調試的程序
next 執行一行代碼,但不進入函數內部
step 執行一行代碼,而且進入函數內部
list 列出源代碼的一部分
print 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

給非法地址賦值,導致段錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章