廈門服裝商城網站建設優(yōu)化網站快速排名軟件
GDB(GNU Debugger)是GNU項目調試器的縮寫,它是Linux下一個強大的C/C++(以及其他語言如Fortran)程序調試工具。以下是對GDB的詳細解釋:
一、GDB的功能
GDB允許開發(fā)者對程序執(zhí)行進行深入控制,可以檢查程序在運行時的內部狀態(tài),如變量的值、內存狀態(tài)、調用棧情況等。它提供了一系列的命令來幫助開發(fā)者控制程序的執(zhí)行流程、檢查程序狀態(tài)、修改程序的行為等。具體來說,GDB具有以下主要功能:
- 設置斷點:開發(fā)者可以在程序的特定位置設置斷點,當程序運行到這些位置時,GDB會暫停程序的執(zhí)行,以便開發(fā)者進行調試。
- 單步調試:GDB允許開發(fā)者逐行執(zhí)行程序,以便觀察程序在每一步的執(zhí)行情況。
- 查看變量的值:開發(fā)者可以在GDB中查看程序中變量的當前值,以便了解程序的內部狀態(tài)。
- 動態(tài)改變程序的執(zhí)行環(huán)境:GDB允許開發(fā)者在程序運行時動態(tài)地改變程序的執(zhí)行環(huán)境,如修改變量的值、改變程序的輸入等。
二、GDB的常用命令
GDB提供了豐富的命令集,以下是一些常用的命令:
- run(或start):啟動程序。默認情況下,run指令會一直執(zhí)行程序,直到執(zhí)行結束。如果程序中手動設置有斷點,則run指令會執(zhí)行程序至第一個斷點處。start指令會執(zhí)行程序至main()主函數的起始位置,即在main()函數的第一行語句處停止執(zhí)行。
- break(或b):設置斷點。開發(fā)者可以在程序的特定位置設置斷點,以便在程序運行到這些位置時暫停執(zhí)行。
- step(或s):單步執(zhí)行程序。如果當前行調用了函數,則進入函數內部。
- next(或n):單步執(zhí)行程序,但不進入函數內部。
- info args:顯示當前函數的參數。
- watch:設置監(jiān)視點,用于監(jiān)視程序中變量的值何時發(fā)生變化。當設置的變量值發(fā)生變化時,程序執(zhí)行會暫停。
- delete:刪除指定編號的斷點或監(jiān)視點。
- disable:禁用指定編號的斷點或監(jiān)視點,而不是完全刪除它。
- enable:重新啟用之前禁用的斷點或監(jiān)視點。
三、GDB的使用場景
GDB主要用于C/C++等編程語言的程序調試。它可以幫助開發(fā)者在程序執(zhí)行過程中查找和修復錯誤,提高程序的穩(wěn)定性和可靠性。同時,GDB也是學習C/C++等編程語言的重要工具之一,通過調試程序,開發(fā)者可以更加深入地理解程序的執(zhí)行流程和內部機制。
綜上所述,GDB是一個功能強大的程序調試工具,它提供了豐富的命令集和強大的調試功能,是C/C++等編程語言開發(fā)者不可或缺的工具之一。
四、GDB調試單個程序
示例程序,一個簡單的插入排序算法c++
#include<iostream>void fastsort(int *a,int size){for (int i = 0; i < size; i++){ int min = a[i],min_index=i;for (int j = i; j < size-1; j++){if (a[j+1] < min){min = a[j+1];min_index = j+1;}}a[min_index] = a[i];a[i] = min;}for (int i = 0; i < size; i++){std::cout <<a[i]<< std::endl;}}int main(int argc, char const *argv[]){int a[] = {3,2,3,4,5,9,8,1,2,5,6};// std::cout <<sizeof a /sizeof(int)<< std::endl;fastsort(a,sizeof(a)/sizeof(int) +1);return 0;}
加入-g
如果要使用gdb進行調試,首先編譯命令中要加入-g 將調試信息加入可執(zhí)行文件中
g++ -g -o fastsort fastsort.c++
然后使用gdb打開可執(zhí)行文件,gdb fastsort
進入gdb調試界面
l
使用l
可以打印出源代碼(gdb 默認打印10行)
如果源代碼放在其他地方
(1). 使用如下命令查看目標文件中保存的是相對路徑還是絕對路徑
readelf -p .debug_str target_bin_file
(2). 如果是相對路徑:
使用 gdb 的dir命令添加的源碼搜索路徑
(3). 如果是絕對路徑:
進行路徑重新映射:set substitute-path old_path new_path
b
我們可以使用b
打上斷點
當程序運行到這個斷點時會停止(cpu陷入指令)
r
打完斷點后,需要讓程序運行起來,使用r
可以看到我們的程序在40行停了下來
n
如果我們想讓程序在斷點后,單步運行,則使用n
可以看到我們又在48行聽了下來
c
如果有多個斷點,在上個斷點后可以使用c
,讓程序繼續(xù)運行到下個斷點中