【Linux我做主】GDB調試工具完全指南

Linux下GDB調試工具完全指南:25個核心命令詳解與實戰示例

github地址

有夢想的電信狗

前言

GDB(GNU Debugger)Linux開發中不可或缺的調試工具,尤其在定位代碼邏輯錯誤和內存問題時表現卓越。本文基于實際開發經驗,詳解25個高頻GDB命令,配合場景化案例和注意事項,助你快速掌握Linux調試核心技能。


我們以該代碼為例來進行gdb的演示,為了方便起見,代碼中標識了行號。

  #include <stdio.h>2                                                                                                                                                  3 int addToTop(int top){4     int res =  0;5     int i = 1;6     for(; i <= top; ++i){7         res += i;8     }9     return res;10 }11 12 int main(){13     printf("debug begin\n");14     15     int top = 100;16     int sum = addToTop(top);17     18     printf("sum is : %d\n", sum);19     20     printf("debug end\n");21     return 0;22 }

準備工作

  • 程序的發布方式有兩種,debug模式和release模式
  • Linux gcc/g++出來的二進制程序,默認是release模式
  • 要使用gdb調試,必須在源代碼生成二進制程序的時候, 加上 -g 選項
    在這里插入圖片描述
  • 我們可以修改makefile中的依賴方法來進行-g編譯
    在這里插入圖片描述
    在這里插入圖片描述
    加上-g選項后,攜帶有調試信息,就可以用gdb進行調試了
gdb mycode  # 開始調試該程序

1. 基礎調試命令

80%的指令都是圍繞定位問題產生的,打斷點就是找問題的一種方式

1.1 list/l 行號

描述:從指定行號開始顯示源代碼(默認顯示10行),接著上次的位置開始列出。
注意:需在編譯時添加-g選項保留調試信息。
場景:快速定位代碼上下文。

(gdb) l 0  # 從該文件的開始顯示代碼

在這里插入圖片描述
在gdb中,默認會記錄最近一次指令,因此連續回車會一直執行上一條指令。

1.2 list/l 函數名

描述:列出指定函數的完整源碼。
注意:函數需在當前加載的符號表中。
場景:查看函數實現細節。

(gdb) l addToTop  # 顯示addToTop函數代碼
(gdb) l main  # 顯示main函數代碼

在這里插入圖片描述


2. 斷點管理

2.0 run/r

描述:從頭開始執行程序,直到斷點或程序結束。
注意:重復執行會重新加載程序。
場景:啟動調試或重新運行程序。

(gdb) r  # 啟動程序

2.1 break/b 行號

描述:在指定行設置斷點。
注意:行號需在有效代碼范圍內。
場景:精準攔截問題發生點。

(gdb) b 15  # 在第15行設斷點
(gdb) b 16  # 在第16行設斷點
(gdb) b 21  # 在第21行設斷點

在這里插入圖片描述

2.2 break/b 函數名

描述:在函數入口設置斷點。
注意:需確保函數已加載。
場景:監控特定函數調用。

(gdb) b addToTop  # 在addToTop入口暫停

在這里插入圖片描述### 2.3 info break/b
描述:顯示所有斷點信息(編號/位置/啟用狀態)。
場景:查看當前斷點布局。

(gdb) info b  # 顯示斷點列表

查看我們已設置的斷點信息:
在這里插入圖片描述

2.4 delete/d breakpoints/b n

我們在刪除斷點時,不能刪除指定代碼行的斷點。
在我們使用info b指令時,該指令為我們的斷點進行了編號,需要通過編號來刪除斷點。
描述:刪除指定編號的斷點。
注意:刪除后不可恢復。
場景:清理無效斷點。

(gdb) delete 1  # 刪除1號斷點

在這里插入圖片描述

3.5 disable/enable breakpoints

有時會不想刪除這個斷點(因為要保留調試痕跡),但想讓這個斷點不工作(因為已經確認錯誤并不在當前斷點內),因此要對斷點進行使能

描述:臨時禁用/啟用斷點。
場景:保留斷點配置但不觸發。

(gdb) disable 1-3  # 禁用1-3號斷點
(gdb) enable 2    # 啟用2號斷點

在這里插入圖片描述

  • enable斷點指令如下
    在這里插入圖片描述

3. 單步調試與流程控制

2.1 next/n

描述:單步執行(不進入函數)相當于VS下的逐過程。
注意:跳過庫函數和用戶函數調用。
場景:快速跳過無需深入調試的代碼塊。

(gdb) n  # 執行下一行

2.2 step/s

描述:單步執行(進入函數內部)。 相當于VS下的逐語句。
注意:可能跳入系統庫函數(如printf)。
場景:深入分析函數內部邏輯。

(gdb) s  # 進入函數

如果代碼已經是基本的C語句了,n和s沒有區別,n不會跳過整個for循環

2.3 finish

描述:執行完當前函數并返回調用點。
注意:不能在main函數中使用。
場景:快速跳出復雜函數。

(gdb) finish  # 執行到函數返回
  • 進入了一個函數后,直接將該函數運行結束,直接查看該函數的運行結果,方便排除問題是否在該函數內

2.4 until X行號

until 直接運行到 x 行,跳過一定行數的代碼,便于直接定位問題
描述:跳轉到指定行繼續執行。
注意:目標行需在當前函數內。
場景:跳過循環中的已知安全代碼。

(gdb) until 30  # 跳轉到30行

2.5 continue/c

描述:跳轉到指定行繼續執行。
注意:目標行需在當前函數內。
場景:跳過循環中的已知安全代碼。

(gdb) continue 

相當于VS中的F5 從當前位置,直接運行到下一個斷點處,如果中間出現了報錯,那么錯誤就在當前范圍內



4. 變量操作與堆棧分析

4.1 print/p 變量

描述:打印變量當前值。
注意:支持表達式計算。
場景:實時查看數據變化。

(gdb) p count  # 顯示count值
(gdb) p arr[3] # 查看數組元素

4.2 set var

描述:修改運行中的變量值。
注意:類型需匹配。
場景:模擬異常數據測試。

(gdb) set var count=0  # 強制重置計數器

例如在循環中,i遞增100次,預判到可能在第95次遞增時出現問題,可以通過set var修改循環變量的值,直接跳到第95次遞增的過程

4.3 display 變量

描述:持續跟蹤變量(每次暫停自動顯示)。
場景:監控關鍵變量變化趨勢。

(gdb) display total  # 持續顯示total變量

display后左側會有變量編號,undisplay取消變量跟蹤時,后面需要跟左側顯示的變量編號

4.4 info locals

查看當前函數棧內的局部變量
描述:顯示當前棧幀的所有局部變量。
場景:快速查看函數內部狀態。

(gdb) info locals  # 列出當前函數局部變量

5. 高級調試技巧

5.1 backtrace/bt

查看各級函數的互相調用關系和傳參情況

描述:顯示函數調用棧(含參數)。
場景:分析崩潰時的調用鏈路。

(gdb) bt  # 顯示調用堆棧

5.2 frame N

描述:切換到指定堆棧幀(配合bt使用)。
場景:查看上級調用者上下文。

(gdb) frame 2  # 查看第二層棧幀

5.3 watch 變量

描述:設置數據觀察點(變量修改時暫停)。
注意:僅對特定內存地址生效。
場景:定位意外修改問題。

(gdb) watch *0x7fffffffe234  # 監控內存地址

結語

不要認為gdb或VS等調試工具很先進,思考代碼邏輯或者printf信息也是調試方法,只要能快速方便的定位并解決問題,都是好方法

掌握GDB調試技能是Linux開發者的核心能力之一。本文涵蓋的25個命令已覆蓋90%日常調試場景,建議結合真實項目實踐加深理解。歡迎在評論區交流實戰經驗!

以上就是本文的所有內容了,如果覺得文章寫的不錯,還請留下免費的贊和收藏,也歡迎各位大佬在評論區交流
分享到此結束啦
一鍵三連,好運連連!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77738.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT中柵格模式探索

1、Qt中選擇了柵格模式&#xff0c;如下圖所示&#xff1a; 2、在進行整個大的UI界面布局時&#xff0c;需了解每個控件所需要選擇的屬性sizePolicy。 sizePolicy包含如下幾種選擇&#xff1a; 3、舉個例子&#xff1a;此時整個UI界面&#xff0c;我采用了柵格模式&#xf…

【計算機網絡】3數據鏈路層①

這篇筆記專門講數據鏈路層的功能。 2.功能 數據鏈路層的主要任務是讓幀在一段鏈路上或一個網絡中傳輸。 2.1.封裝成幀(組幀) 解決的問題:①幀定界②幀同步③透明傳輸 實現組幀的方法通常有以下種。 2.1.1.字符計數法 原理:在每個幀開頭,用一個定長計數字段來記錄該…

[區塊鏈lab2] 構建具備加密功能的Web服務端

實驗目標&#xff1a; 掌握區塊鏈中密碼技術的工作原理。在基于Flask框架的服務端中實現哈希算法的加密功能。 實驗內容&#xff1a; 構建Flash Web服務器&#xff0c;實現哈希算法、非對稱加密算法的加密功能。 實驗步驟&#xff1a; 哈希算法的應用&#xff1a;創建hash…

藍橋杯之前綴和

一維前綴 解題思路 看到“區間之和”問題&#xff0c;直接想到“前綴和” 前綴和的核心公式&#xff1a; sum[i]sum[i?1]a[i] 利用前綴和求區間和 [l,r] 的公式&#xff1a; 區間和sum[r]?sum[l?1] 解題步驟模板 輸入數組&#xff1a; 讀取數組長度 n 和查詢次數 m。 讀…

【學習筆記】計算機網絡(八)—— 音頻/視頻服務

第8章 互聯網上的音頻/視頻服務 文章目錄 第8章 互聯網上的音頻/視頻服務8.1概述8.2 流式存儲音頻/視頻8.2.1 具有元文件的萬維網服務器8.2.2 媒體服務器8.2.3 實時流式協議 RTSP 8.3 交互式音頻/視頻8.3.1 IP 電話概述8.3.2 IP電話所需要的幾種應用協議8.3.3 實時運輸協議 RTP…

【WRF運行】解決metgrid生成文件太大無內存!

目錄 方法:改變工作目錄運行 metgrid.exe參考由于我的運行內存過小,當研究區較大時,metgrid生成文件內存太大,導致每次運行都報錯,此時可更改工作目錄(空余文件夾)以運行 metgrid.exe(并非必須在wrf安裝目錄下運行!!!)。 metgrid.exe 本身不支持直接通過參數或 nam…

基于 Django 進行 Python 開發

基于 Django 進行 Python 開發涉及多個方面的知識點,以下為你詳細介紹: 1. Django 基礎 項目與應用創建 借助django-admin startproject project_name來創建新的 Django 項目。利用python manage.py startapp app_name創建新的應用。項目結構 理解項目各文件和目錄的作用,像…

【sylar-webserver】8 HOOK模塊

文章目錄 知識點HOOK實現方式非侵入式hook侵入式hook ??? 覆蓋系統調用接口獲取被全局符號介入機制覆蓋的系統調用接口 具體實現C 模板成員函數繼承 和 成員函數指針類型匹配 ?????FdCtx 和 FdManager ??判斷socket的小技巧FdCtxFdManager connect hook ?do_io模板 …

SpringAI+DeepSeek大模型應用開發——1 AI概述

AI領域常用詞匯 LLM&#xff08;LargeLanguage Model&#xff0c;大語言模型&#xff09; 能理解和生成自然語言的巨型AI模型&#xff0c;通過海量文本訓練。例子&#xff1a;GPT-4、Claude、DeepSeek、文心一言、通義干問。 G&#xff08;Generative&#xff09;生成式: 根據上…

SpringBoot 基本原理

SpringBoot 為我們做的自動配置&#xff0c;確實方便快捷&#xff0c;但一直搞不明白它的內部啟動原理&#xff0c;這次就來一步步解開 SpringBoot 的神秘面紗&#xff0c;讓它不再神秘。 目錄 SpringBootApplication 背后的秘密 Configuration ComponentScan EnableAutoC…

2025.4.17總結

工作&#xff1a;今天對需求的測試設計進行了完善&#xff0c;然后&#xff0c;對測試設計進行了評審&#xff0c;最后提了個問題單。 反思這個過程&#xff0c;要說不足的地方&#xff0c;就是評審的時候總覺得自己吐字不清晰&#xff0c;表達能力早就想提升了&#xff0c;但…

2021-11-14 C++三七二十一數

緣由c編程怎么寫&#xff0c;緊急求解-編程語言-CSDN問答 void 三七二十一數() {//緣由https://ask.csdn.net/questions/7566632?spm1005.2025.3001.5141int n 0, a 0, b 0, p 1;std::cin >> n;while (n--){std::cin >> a >> b;while (a<b){if (a %…

大模型面經 | DeepSpeed中ZeRO-1、ZeRO-2和ZeRO-3的區別是什么?

大家好,我是皮先生!! 今天給大家分享一些關于大模型面試常見的面試題,希望對大家的面試有所幫助。 往期回顧: 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題一) 大模型面經 | 春招、秋招算法面試常考八股文附答案(RAG專題二) 大模型面經 | 春招、秋招算法…

spring boot 文件上傳

1.編寫文件上傳的表單頁面 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><meta http-equiv"Content-Type" content"text/html; charsetUTF-8&qu…

機器學習核心算法全解析:從基礎到進階的 18 大算法模型

在機器學習領域&#xff0c;算法模型是解決實際問題的核心工具。 不同的算法適用于不同的數據場景和任務需求&#xff0c;理解它們的原理與應用是掌握機器學習的關鍵。 以下將詳細解析 18 個核心算法模型&#xff0c;涵蓋監督學習、無監督學習、集成學習和深度學習等多個領域…

5G網絡切片:精準分配資源,提升網絡效率的關鍵技術

5G網絡切片&#xff1a;精準分配資源&#xff0c;提升網絡效率的關鍵技術 隨著5G技術的廣泛應用&#xff0c;網絡切片&#xff08;Network Slicing&#xff09;作為其核心創新之一&#xff0c;正在改變傳統網絡架構。它通過將物理網絡劃分為多個邏輯網絡&#xff08;切片&…

Spring Boot中Excel處理完全指南

文章目錄 1. Excel處理基礎知識1.1 為什么需要在應用中處理Excel文件&#xff1f;1.2 Java中的Excel處理庫介紹1.2.1 Apache POI1.2.2 EasyExcel1.2.3 JExcel1.2.4 Apache POI SXSSF 1.3 Spring Boot中集成Excel處理 2. 在Spring Boot中集成Excel處理庫2.1 集成Apache POI2.1.1…

Elasticsearch 8.18 中提供了原生連接 (Native Joins)

作者&#xff1a;來自 Elastic Costin Leau 探索 LOOKUP JOIN&#xff0c;這是一條在 Elasticsearch 8.18 的技術預覽中提供的新 ES|QL 命令。 很高興宣布 LOOKUP JOIN —— 這是一條在 Elasticsearch 8.18 的技術預覽中提供的新 ES|QL 命令&#xff0c;旨在執行左 joins 以進行…

2025年滲透測試面試題總結-拷打題庫03(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年滲透測試面試題總結-拷打題庫03 一、Windows與Linux系統提權思路 Windows提權 Linux提權 二、…

【華為】OSPF震蕩引起CPU占用率高怎么解決?

原創&#xff1a;廈門微思網絡 現象描述 如圖所示&#xff0c;Switch_1、Switch_2、Switch_3和Switch_4配置了OSPF協議&#xff0c;發現Switch_1設備的CPU占用率高&#xff0c;ROUT任務占用率明顯高于其他任務并且產生路由震蕩。 故障組網圖 原因分析 網絡中IP地址沖突導致…