GDB使用基本教程
1. 先了解GDB的基本輸入命令
命令 | 命令縮寫 | 命令說明 |
---|---|---|
list | l | 顯示多行源代碼 |
break | b | 設置斷點,程序運行到斷點的位置會停下來 |
info | I | 描述程序的狀態 |
run | r | 開始運行程序 |
display | disp | 跟蹤查看某個變量,每次停下來都顯示它的值 |
step | s | 執行下一條語句,如果該語句爲函數調用,則進入函數執行其中的第一條語句 |
next | n | 執行下一條語句,如果該語句爲函數調用,不會進入函數內部執行(即不會一步步地調試函數內部語句) |
p | 打印內部變量值 | |
continue | c | 繼續程序的運行,直到遇到下一個斷點 |
set var name=v | 設置變量的值 | |
start | st | 開始執行程序,在main函數的第一條語句前面停下來 |
file | 裝入需要調試的程序 | |
kill | k | 終止正在調試的程序 |
watch | 監視變量值的變化 | |
backtrace | bt | 查看函數調用信息(堆棧) |
frame | f | 查看棧幀 f n 切換到編號爲n的棧 |
quit | q | 退出GDB環境 |
2. 範例學習
2.1 學習gdb調試,首先會先用gcc/g++進行編譯
gcc/g++命令使用說明
gcc/g++ [options] file1 file2…
選項 | 描述 | 示例 |
---|---|---|
-E | 只執行預處理操作 | |
-S | 只執行到編譯操作完成,不進行彙編操作,生成的是彙編文件(.s 或 .asm),內容爲彙編語言 | |
-c | 執行編譯和彙編,但不進行鏈接,即只生成可重定位目標文件(.o),爲二進制文件,不生成完整的可執行文件 | |
-o filename | 將操作後的內容輸出到filename指定的文件中 | |
-static | 對於支持動態鏈接的系統,使用靜態鏈接而不是動態鏈接進行鏈接操作 | |
-g | 編譯時生成debug有關的程序信息(供gdb使用) | |
–save-temps | 生成編譯過程的中間結果文件(包括預處理文件(x.ii)、彙編代碼(x.s)、目標文件(x.o)和最終的可執行文件) | |
-I PATH | 在PATH指定的目錄下尋找相關的include文件,參數中間不加空格 | |
-lxx | 其中xx爲指定函數庫,對於Linux環境下的函數庫,靜態庫後綴爲.a,動態庫後綴爲.so,一般庫名爲libxx.a或libxx.so,如加入libm.so庫,則使用參數-lm(去除lib和後綴.a\so) | |
-L PATH | 在PATH指定的目錄下尋找相關的庫文件,即-lxx指定待鏈接的庫,-L指定尋找該庫的路徑。不指定時搜索默認的庫函數路徑 | |
-std=xx | 指定編譯使用的語言標準 | |
-x language | 指定待編譯文件的語言,而不是由編譯器根據文件後綴自行判斷。即默認情況下gcc根據文件後綴判斷使用的編程語言。例如使用文件名hello作爲源文件名是不合適的,應使用hello.c |
|
-Wall | 輸出一些簡單的錯誤以及一些可能存在問題的警告 | |
-Wextra | 輸出-Wall不包含的警告等 | |
-Werror | 將警告視爲錯誤輸出 | |
-Wl,option | 通過該選項將參數 option 作爲後續鏈接器 ld 使用的參數 | |
-Wl,rpath=/path/to/lib | 爲鏈接器指定一個非默認的運行時庫的搜索路徑,運行採用了該選項編譯的程序時,鏈接器會在-rpath 指定的目錄中搜索所需的 so 庫文件,以將其載入內存中 | |
-D name=definition | 加入宏定義,若不指定def,則默認爲1 | |
-O1、-O2 | 規定編譯器的優化等級,優化級數越高執行效率一般越好,但是優化會改變原有程序結構,使得其彙編不易理解 | |
-fstack-protector-fno-stack-protector | 是否開啓堆棧保護,這裏的保護是在返回地址之前加入一個驗證值來確保返回地址不被破壞 | |
-z execstack | 啓用可執行棧,默認是禁用的(echo 0 >/proc/sys/kernel/randomize_va_space 關閉地址隨機化,這是一個單獨的命令,操作需要root權限) |
2.2 先給出一個程序代碼例子
#include <stdio.h>
void debug(char *str)
{
printf("debug info :%s\n",str );
}
int main(int argc,char *argv[]){
int i,j;
j=0;
for(i=0;i<10;i++){
j+=5;
printf("now a=%d\n", j);
}
return 0;
}
輸入命令進行編譯gcc -g -o gdb_study gdb_study.c
,生成可執行文件與gdb調試中間文件
未完待續…
3. 本文參考文章
- Linux下編輯、編譯、調試命令總結——gcc和gdb描述https://www.cnblogs.com/yhjoker/p/7533438.html
- gdb調試的基本使用 https://www.cnblogs.com/HKUI/p/8955443.html
- GCC編譯命令常用選項https://www.cnblogs.com/clover-toeic/p/3737129.html
- gdb調試學習 https://www.cnblogs.com/feixiang927/p/5000923.html
- gdb 學習 https://www.cnblogs.com/feixiang927/p/5000923.html