Linux 調試代碼工具:gdb

文章目錄

  • 一、debug vs release:兩種程序形態的本質差異
    • 1. 什么是 debug 與 release?
    • 2. 核心差異對比
  • 二、為什么需要 debug:從項目生命周期看調試價值
    • 1. 項目開發流程中的調試閉環(流程圖示意)
    • 2. Debug 的核心意義與目的
  • 三、gdb 的使用🔑
    • 1. 編譯階段:gcc/g++ -g
      • (1)gcc/g++ 的 debug 編譯選項
      • (2)驗證調試信息是否正確生成
    • 2. gdb 調試入門:從啟動到核心命令使用
      • (1)啟動調試會話:gdb [可執行程序]
      • (2)核心調試命令速查表📝
      • (3)🔴斷點 Break Point:b
        • 🚀基礎斷點:按行號或函數快速暫停
        • 🧠條件斷點:動態過濾無效暫停
        • 📑查看斷點列表:info break
        • 🛑禁用 / ?啟用斷點:disable/enable [編號]
        • 🗑?刪除斷點:delete [編號]


一、debug vs release:兩種程序形態的本質差異

1. 什么是 debug 與 release?

  • Debug 版本(調試版):
    編譯器在構建時保留符號表、調試信息(變量名、函數名、行號等)
    禁用或減少代碼優化(默認優化級別 -O0)
    包含額外調試輔助代碼(如斷言 assert、邊界檢查)
    目標:為開發者提供完整的調試上下文
  • Release 版本(發布版):
    剝離符號表與調試信息(可通過 strip 進一步精簡)
    啟用深度優化(默認優化級別 -O2,追求執行效率)
    移除調試輔助代碼,壓縮體積并提升運行性能
    目標:提供給用戶的最終交付形態

2. 核心差異對比

特性Debug 版本Release 版本
編譯選項-g(生成調試信息)、-O0(無優化)-O2(默認優化)、-s(剝離符號)
符號表完整保留(函數名、變量名、行號)僅保留必要符號(用于動態鏈接)
文件體積較大(調試信息占比可達 50%+)較小(優化后代碼更緊湊)
執行效率慢(無優化且含調試輔助代碼)快(指令重排、循環展開等優化)
調試支持完全支持(GDB 精準定位到源碼行)僅支持有限調試(需手動加載符號表)
典型用途開發階段調試、單元測試生產環境部署、用戶交付

二、為什么需要 debug:從項目生命周期看調試價值

1. 項目開發流程中的調試閉環(流程圖示意)

自測通過
自測不通過
測試通過
測試發現問題
立項
開發
debug
release發布
開發自測release版
提交測試,測試團隊驗證release
上線
灰度內測
全量運營

關鍵反饋節點:
開發階段:基于 Debug 版快速定位邏輯錯誤(如空指針、數組越界)
自測階段:用 Release 版驗證性能與資源占用(Debug 版的優化缺失可能掩蓋真實問題)
測試階段:通過核心轉儲(Core Dump)分析生產環境 Crash 時,需依賴 Debug 符號表

2. Debug 的核心意義與目的

  • 精準定位問題根源

  • 驗證程序邏輯正確性:調試器支持單步執行(step)、條件斷點(break if i>100),允許開發者逐行驗證分支邏輯、循環

  • 優化代碼可讀性與可維護性:debug 階段暴露的問題(如復雜函數邏輯)促使開發者重構代碼,間接提升代碼質量;斷言(assert())在 Debug 版生效,強制檢查前置條件(如指針非空),提前暴露潛在風險

  • 銜接測試與生產環境


三、gdb 的使用🔑

1. 編譯階段:gcc/g++ -g

(1)gcc/g++ 的 debug 編譯選項

# 基礎調試配置(必備)  
gcc -g -o debug_program source.c    # C語言編譯  
g++ -g -o debug_program source.cpp  # C++語言編譯  

🚨注意:默認情況下(不加 -g),gcc/g++ 生成 release 版

(2)驗證調試信息是否正確生成

# 檢查符號表(含函數名/變量名)  
nm debug_program | grep main            # 應顯示main函數地址與符號名  # 對比Release版(無符號表時僅顯示地址)  
nm release_program | grep main          # 可能顯示 T 0x400550(無符號名)  

2. gdb 調試入門:從啟動到核心命令使用

(1)啟動調試會話:gdb [可執行程序]

gdb debug_program    # 調試可執行文件  

(2)核心調試命令速查表📝

命令全稱功能描述示例
llist顯示源碼(默認 10 行,可指定行號 / 函數名)l 50 顯示第 50 行附近代碼;l main 顯示 main 函數
bbreak設置斷點(行號 / 函數名 / 條件表達式)b 100 在第 100 行設斷點;b myfunc if x>10 條件斷點
rrun運行程序(可帶參數)r input.txt 以 input.txt 為參數運行程序
nnext逐過程,單步執行(跳過函數調用)在調用函數時,n 會直接執行完整個函數調用
sstep逐語句,單步執行(進入函數內部)調試自定義函數時,s 會進入函數第一行
pprint打印變量 / 表達式值p *ptr 打印指針指向的值;p arr[5] 打印數組元素
display-自動顯示變量(程序暫停時更新)display i 每次暫停時顯示變量 i 的值
undisplay-取消自動顯示undisplay 1 取消第 1 號自動顯示項(info display查看編號)
btbacktrace查看調用棧(定位函數調用順序)段錯誤時執行bt,快速定位出錯函數
qquit退出調試q 退出 gdb 會話
set varset variable動態修改變量值(在調試過程中臨時賦值,影響程序運行邏輯)set var i=10 將變量 i 的值強制設為 10;set *ptr=0x1234 修改指針指向的內存值
finish-繼續運行直到當前函數返回(跳出當前函數,查看返回值)step 進入子函數后,執行 finish 直接運行到函數返回并停在調用行

gdb 內置命令歷史機制,可自動記錄最近執行的命令,在完成一條命令后直接按下回車鍵,即可快速重復執行上一條命令。

示例:

(gdb) next  # 第一次輸入next命令,單步執行程序  
Breakpoint 1, main () at test.c:10  
10          int x = 5;  
(gdb)       # 直接回車,重復執行上一條命令(next)  
11          x += 3;  
(gdb)       # 再次回車,繼續重復執行next  
12          printf("x = %d\n", x);  

(3)🔴斷點 Break Point:b

bbreak 命令的縮寫,是 gdb 中 設置斷點(Breakpoint) 的核心指令。

🚀基礎斷點:按行號或函數快速暫停

? 行號斷點:最直接的位置標記
語法:b [行號] 或 break [行號]
作用:在當前文件的指定源碼行號處設置斷點,程序運行到該行時暫停。

(gdb) b 100          # 在當前文件第100行設置斷點  
(gdb) break test.c:50 # 在test.c文件的第50行設置斷點(跨文件指定)

? 函數斷點:按邏輯單元定位
語法:b [函數名] 或 break [函數名]
作用:在函數入口處設置斷點,包括自定義函數、庫函數或系統調用。

(gdb) b main         # 在程序入口main函數處設置斷點(程序啟動后首次暫停)  
(gdb) break printf    # 在調用標準庫函數printf時暫停(需保留符號表)  
(gdb) b mymodule.c:myfunc # 在mymodule.c文件的myfunc函數入口處暫停  

優勢:無需關心具體行號,直接按函數邊界控制執行流,適合模塊化調試(如快速定位某個功能函數的邏輯起點)。

🧠條件斷點:動態過濾無效暫停

語法:b [行號或函數名] if [條件表達式]
作用:僅當條件表達式為真時,斷點才生效(避免每次執行到斷點都暫停,提升調試效率)。

(gdb) b 200 if i==100 # 當循環變量i等于100時,在第200行暫停(跳過前99次循環)  
(gdb) break myfunc if *ptr==NULL # 當指針ptr為空時,在myfunc函數入口暫停(定位空指針異常)  
📑查看斷點列表:info break
(gdb) info break  
Num     Type           Disp Enb Address            What  
1       breakpoint     keep y   0x00000000004005a3 in main at test.c:10  
2       watchpoint     keep y   0x00007fffffffde40 array[5]  
  • Num:斷點編號(刪除 / 禁用時需指定此編號)。
  • Type:斷點類型(breakpoint/watchpoint/hbreakpoint)。
  • Enb:是否啟用(y 啟用,n 禁用)。
  • Disp:斷點持續性(keep 持續生效,del 觸發一次后刪除)。
🛑禁用 / ?啟用斷點:disable/enable [編號]
(gdb) disable 2      # 禁用編號為2的內存斷點(暫時忽略,保留配置)  
(gdb) enable 1       # 重新啟用編號為1的行斷點(無需重新設置條件)  
🗑?刪除斷點:delete [編號]

ps.命令縮寫:d [編號]

(gdb) delete 1       # 刪除編號為1的行斷點  
(gdb) delete         # 刪除所有斷點(需確認提示)  
(gdb) d <斷點編號>        # 例:d 3 (等價于 delete 3)  
(gdb) delete            # 不加編號時,🔴刪除所有斷點(謹慎使用!)  

斷點編號的「線性增長」特性
GDB 內部維護一個 全局唯一的斷點編號計數器,具備以下特性:

  • 編號永不重復:
    每個斷點(包括行斷點、函數斷點、觀察點等)被創建時,編號按創建順序依次遞增,與是否刪除無關。
    例:依次創建 3 個斷點,編號為 1、2、3;
    刪除編號 2 后,新創建的斷點編號為 4(而非復用 2)。
  • 刪除不影響后續編號:
    即使中間編號的斷點被刪除,新斷點的編號仍從 當前最大編號 +1 繼續生成。
    例:
(gdb) break main.c:10   # 斷點1  
(gdb) break main.c:20   # 斷點2  
(gdb) delete 2          # 刪除斷點2  
(gdb) break main.c:30   # 新斷點編號為3(而非2)  
(gdb) info breakpoints  
# 輸出:Num 1, 3(斷點2已刪除)  

END

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

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

相關文章

Python設計模式:命令模式

1. 什么是命令模式&#xff1f; 命令模式是一種行為設計模式&#xff0c;它將請求封裝為一個對象&#xff0c;從而使您能夠使用不同的請求、隊列或日志請求&#xff0c;以及支持可撤銷操作。 命令模式的核心思想是將請求的發送者與請求的接收者解耦&#xff0c;使得兩者之間的…

nlp面試重點

深度學習基本原理&#xff1a;梯度下降公式&#xff0c;將損失函數越來越小&#xff0c;最終預測值和實際值誤差比較小。 交叉熵&#xff1a;-p(x)logq(x)&#xff0c;p(x)是one-hot形式。如果不使用softmax計算交叉熵&#xff0c;是不行的。損失函數可能會非常大&#xff0c;…

Leetcode:二叉樹

94. 二叉樹的中序遍歷 class Solution {public List<Integer> inorderTraversal(TreeNode root) {TreeNode cur root;Stack<TreeNode> stack new Stack<>();List<Integer> list new ArrayList<>();while (!stack.isEmpty() || cur ! null) {…

SQL:Constraint(約束)

目錄 &#x1f3af; 什么是 Constraint&#xff1f; MySQL 中常見的約束類型&#xff1a; 1. PRIMARY KEY 2. FOREIGN KEY 3. UNIQUE 4. NOT NULL 5. DEFAULT 6. CHECK&#xff08;MySQL 8.0&#xff09; 7. AUTO_INCREMENT &#x1f3af; 什么是 Constraint&#xf…

數據庫數據恢復——sql server數據庫被加密怎么恢復數據?

SQL server數據庫數據故障&#xff1a; SQL server數據庫被加密&#xff0c;無法使用。 數據庫MDF、LDF、log日志文件名字被篡改。 數據庫備份被加密&#xff0c;文件名字被篡改。 SQL server數據庫數據恢復過程&#xff1a; 1、將所有數據庫做完整只讀備份。后續所有數據恢…

MySQL 用 limit 影響性能的優化方案

一.使用索引覆蓋掃描 如果我們只需要查詢部分字段&#xff0c;而不是所有字段&#xff0c;我們可以嘗試使用索引覆蓋掃描&#xff0c;也就是讓查詢所需的所有字段都在索引中&#xff0c;這樣就不需要再訪問數據頁&#xff0c;減少了隨機 I/O 操作。 例如&#xff0c;如果我們…

【算法筆記】并查集詳解

&#x1f680; 并查集&#xff08;Union-Find&#xff09;詳解&#xff1a;原理、實現與優化 并查集&#xff08;Union-Find&#xff09;是一種非常高效的數據結構&#xff0c;用于處理動態連通性問題&#xff0c;即判斷若干個元素是否屬于同一個集合&#xff0c;并支持集合合…

鴻蒙HarmonyOS埋點SDK,ClkLog適配鴻蒙埋點分析

ClkLog埋點分析系統&#xff0c;是一種全新的、開源的洞察方案&#xff0c;它能夠幫助您捕捉每一個關鍵數據點&#xff0c;確保您的決策基于最準確的用戶行為分析。技術人員可快速搭建私有的分析系統。 ClkLog鴻蒙埋點SDK通過手動埋點的方式實現HarmonyOS 原生應用的前端數據采…

JMeter的關聯

關聯&#xff1a;上一個請求的響應結果和下一個請求的數據有關系 xpath提取器 適用場景 HTML/XML文檔結構化數據&#xff1a; 適用于從HTML或XML文檔中提取結構化數據。例如&#xff0c;提取表格中的數據、列表中的項目等。示例&#xff1a;從HTML表格中提取所有行數據。 …

Spring Security 權限配置詳解

&#x1f31f;Spring Security 權限配置詳解&#xff1a;從基礎到進階 Spring Security 是一個功能強大、可高度自定義的安全框架&#xff0c;主要用于為基于 Spring 的應用程序提供身份驗證和授權功能。 本篇文章將帶你深入理解 Spring Security 的權限配置機制&#xff0c;掌…

pycharm中安裝Charm-Crypto

一、安裝依賴 1、安裝gcc、make、perl sudo apt-get install gcc sudo apt-get install make sudo apt-get install perl #檢查版本 gcc -v make -v perl -v 2、安裝依賴庫m4、flex、bison(如果前面安裝過pypbc的話,應該已經裝過這些包了) sudo apt-get update sudo apt…

【MCAL】AUTOSAR架構下基于SPI通信的驅動模塊詳解-以TJA1145為例

目錄 前言 正文 1.TJA1145驅動代碼中的SPI協議設計 1.1 對SPI Driver的依賴 1.2 對SPI配置的依賴 1.2.1 SpiExternalDevice 1.2.2 Channel_x 1.2.3 Job_x 1.2.4 Sequence N 1.2.5 Sequence M 1.2.6 Sequence L 1.2.7 小結 2.基于Vector驅動代碼的SPI配置 2.1 SPI引…

JavaScript:BOM編程

今天我要介紹的是JS中有關于BOM編程的知識點內容&#xff1a;BOM編程&#xff1b; 介紹&#xff1a;BOM全名&#xff08;Browser Object Model&#xff08;瀏覽器對象模型&#xff09;&#xff09;。 是瀏覽器提供的與瀏覽器窗口交互的接口&#xff0c;其核心對象是 window。與…

Memcached緩存系統:從部署到實戰應用指南

#作者&#xff1a;獵人 文章目錄 一、安裝libevent二、安裝配置memcached三、安裝Memcache的PHP擴展四、使用libmemcached的客戶端工具五、Nginx整合memcached:六、php將會話保存至memcached Memcached是一款開源、高性能、分布式內存對象緩存系統&#xff0c;可應用各種需要緩…

解決前后端時區不一致問題

前后端時區不一致導致&#xff1a; 》數據不顯示在前端 》頁面顯示時間有誤 》一些對時間有要求的方法&#xff0c;無法正確執行&#xff0c;出現null值&#xff0c;加上我們對null值有判斷/注解&#xff0c;程序就會報錯中斷&#xff0c;以為是業務邏輯問題&#xff0c;其實…

35.Java線程池(線程池概述、線程池的架構、線程池的種類與創建、線程池的底層原理、線程池的工作流程、線程池的拒絕策略、自定義線程池)

一、線程池概述 1、線程池的優勢 線程池是一種線程使用模式&#xff0c;線程過多會帶來調度開銷&#xff0c;進而影響緩存局部性和整體性能&#xff0c;而線程池維護著多個線程&#xff0c;等待著監督管理者分配可并發執行的任務&#xff0c;這避免了在處理短時間任務時創建與…

驅動開發硬核特訓 · Day 6 : 深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 從靜態綁定驅動模型到現代設備模型 主題&#xff1a;深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比 在上一節中&#xff0c;我們從驅動框架的歷史演進出…

Blender安裝基礎使用教程

本博客記錄安裝Blender和基礎使用&#xff0c;可以按如下操作來繪制標靶場景、道路標識牌等。 目錄 1.安裝Blender 2.創建面板資源 步驟 1: 設置 Blender 場景 步驟 2: 創建一個平面 步驟 3: 將 PDF 轉換為圖像 步驟 4-方法1: 添加材質并貼圖 步驟4-方法2&#xff1a;創…

智能手機功耗測試

隨著智能手機發展,用戶體驗對手機的續航功耗要求越來越高。需要對手機進行功耗測試及分解優化,將手機的性能與功耗平衡。低功耗技術推動了手機的用戶體驗。手機功耗測試可以采用powermonitor或者NI儀表在功耗版上進行測試與優化。作為一個多功能的智能終端,手機的功耗組成極…

從代碼學習深度學習 - 多頭注意力 PyTorch 版

文章目錄 前言一、多頭注意力機制介紹1.1 工作原理1.2 優勢1.3 代碼實現概述二、代碼解析2.1 導入依賴序列掩碼函數2.2 掩碼 Softmax 函數2.3 縮放點積注意力2.4 張量轉換函數2.5 多頭注意力模塊2.6 測試代碼總結前言 在深度學習領域,注意力機制(Attention Mechanism)是自然…