GDB 調試全方位指南:從入門到精通

在程序開發中,調試是定位和解決問題的核心環節。GDB (GNU Debugger) 作為一款功能強大的命令行調試器,是Linux環境下C/C++開發者的必備利器。本文將系統講解GDB的使用方法,涵蓋基礎操作到高級技巧,助你高效排錯。


一、基礎準備:編譯與啟動

1. 程序發布模式與調試信息

  • Debug模式: 編譯器保留完整調試信息(符號表、行號等),便于調試。程序體積較大,運行效率稍低。
  • Release模式: 編譯器進行深度優化,去除調試信息,生成體積小、運行快的程序,不適合直接調試

關鍵點: 要使用GDB調試,編譯時必須顯式添加 -g 選項,生成包含調試信息的可執行文件。

gcc -g test.c -o test  # 編譯包含調試信息的可執行程序 'test'
g++ -g myapp.cpp -o myapp # C++ 同理

2. 啟動與退出 GDB

  • 啟動: gdb <可執行文件名>
    gdb test  # 調試名為 'test' 的程序
    
  • 退出:
    • 輸入命令:quitq
    • 快捷鍵:Ctrl + D

二、核心調試命令詳解

1. 查看源代碼 (list / l)

  • l [行號]: 從指定行號開始顯示源代碼(默認顯示當前上下文10行)。
    • l 15: 顯示第15行附近的代碼。
    • 連續輸入 l 或按 Enter 鍵繼續向下顯示。
  • l [函數名]: 顯示指定函數的源代碼。
    • l main: 顯示 main 函數的代碼。

2. 運行控制

命令縮寫作用
runr開始/重新開始運行程序。遇到斷點暫停,無斷點則運行到結束。
nextn單步執行(不進入函數)。執行下一行代碼,將函數調用當作一步執行完。
steps單步進入。執行下一行代碼,進入被調用函數的內部。
continuec繼續運行。從當前暫停處繼續執行,直到遇到下一個斷點或程序結束。
finishfin執行完當前函數。運行到當前函數返回,并暫停在調用該函數的位置。
until [行號]u運行到指定行。用于跳過循環或快速到達代碼中的特定位置。

3. 斷點管理 (break / b)

  • 設置斷點:
    • b [行號]: 在指定行設置斷點。b 20
    • b [函數名]: 在函數入口處設置斷點。b calculate
  • 查看斷點: info breakpoints (i b)
  • 刪除斷點:
    • delete [斷點編號] (d [編號]): 刪除指定編號斷點。d 2
    • delete (d): 刪除所有斷點。
  • 禁用/啟用斷點:
    • disable [斷點編號]: 禁用斷點(斷點存在但無效)。
    • enable [斷點編號]: 啟用被禁用的斷點。

4. 變量操作

  • 查看值: print [變量名] (p [變量名])
    • p sum: 打印變量 sum 的當前值。
    • p &sum: 打印變量 sum 的地址。
    • p *ptr: 打印指針 ptr 指向的值。
  • 修改值: set var [變量名]=[值]
    • set var count=0: 將變量 count 設置為 0。
  • 自動顯示:
    • display [變量名]: 每次程序暫停時自動顯示該變量的值。
    • info display: 查看當前設置的所有自動顯示項及其編號。
    • undisplay [編號]: 取消指定編號的自動顯示。

5. 其他常用命令

  • backtrace (bt): 查看調用棧。顯示當前執行位置及其調用路徑(棧幀),極其重要!
  • frame [棧幀編號] (f [編號]): 切換棧幀。配合 bt 使用,查看不同函數調用層的上下文。
  • info locals (i locals): 查看當前棧幀的局部變量
  • info args (i args): 查看當前函數的參數值。

三、高級調試技巧

1. 多線程調試

  • info threads (i threads): 列出所有線程,顯示線程ID、狀態和當前執行位置。
  • thread [線程ID] (t [ID]): 切換到指定線程進行調試。t 3
  • thread apply [線程ID] [命令]: 對指定線程執行命令。
    • thread apply 3 bt: 查看線程3的調用棧。
  • thread apply all [命令]: 對所有線程執行命令。
    • thread apply all bt: 查看所有線程的調用棧(非常有用!)。
  • 線程調度鎖:
    • set scheduler-locking on鎖定當前線程。只有當前調試的線程會執行,其他線程暫停,避免干擾。
    • set scheduler-locking off解除鎖定(默認狀態)。所有線程正常調度執行。
    • set scheduler-locking step: 僅在單步執行(n, s)時鎖定當前線程,run/continue時其他線程可運行。

2. 調試核心轉儲 (Core Dump)

核心轉儲記錄了程序崩潰瞬間的內存狀態,是事后調試的關鍵。

  1. 啟用核心轉儲生成:
    ulimit -c unlimited  # 在當前Shell會話中設置核心轉儲文件大小無限制
    
    • 提示: 有時需要配置系統參數(如 /proc/sys/kernel/core_pattern)來指定核心文件路徑和命名規則。
  2. 程序崩潰后,通常會在當前目錄或指定位置生成名為 corecore.[pid] 的文件。
  3. 使用GDB加載核心文件:
    gdb <可執行文件名> <核心文件名>
    
    gdb myapp core.12345  # 調試 'myapp' 程序,加載核心文件 'core.12345'
    
  4. 加載后,立即查看崩潰點
    • bt: 查看崩潰時的完整調用棧,定位問題函數和行號。
    • f [棧幀編號]: 切換到相關棧幀。
    • p [變量] / i locals: 檢查崩潰點的變量狀態。

四、總結與最佳實踐

GDB 是程序調試的瑞士軍刀,熟練掌握它能極大提升排錯效率。關鍵點在于:

  1. 編譯加 -g 調試的基石,沒有調試信息寸步難行。
  2. 善用斷點 (b) 與運行控制 (r, n, s, c): 控制程序執行流程。
  3. 洞察變量狀態 (p, display, info locals): 理解程序內部數據變化。
  4. 利用調用棧 (bt, f): 理清代碼執行路徑,快速定位問題源頭。
  5. 掌握高級技巧:
    • 多線程調試 (info threads, thread, scheduler-locking) 解決并發問題。
    • 核心轉儲調試 (gdb <exe> <core>, bt) 用于事后分析崩潰原因。
  6. 勤加練習: 結合真實項目中的Bug進行調試是掌握GDB的最佳途徑。

小貼士:

  • 使用 .gdbinit 文件可以定制 GDB 啟動行為(如預加載命令、設置別名)。
  • GDB 支持命令補全(按 Tab 鍵)和歷史命令(上下箭頭鍵)。
  • 探索 help [命令] 獲取命令的詳細幫助信息。

通過系統學習和實踐這些技巧,你將能夠更加自信和高效地使用 GDB 征服程序中的各種疑難雜癥,顯著提升開發質量和效率!

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

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

相關文章

Python:從元類到多態的實戰指南

Python 作為一門靈活且強大的編程語言&#xff0c;其高級特性為開發者提供了極大的創造力和代碼優化空間。本文將圍繞元類、序列化、抽象類與多態等核心高級特性展開&#xff0c;結合豐富的實戰代碼示例&#xff0c;從原理到應用進行全方位解析&#xff0c;幫助你更深入地理解 …

LLM實戰(三)——昇騰300i duo推理卡(NPU)大模型推理記錄

npu推理環境配置:https://ascend.github.io/docs/sources/ascend/quick_install.html llama-factory適配的NPU說明:https://llamafactory.readthedocs.io/zh-cn/latest/advanced/npu_inference.html 一些CANN命令: 與cuda的對應關系 # 查看NPU信息 npu-smi info = nvidia-s…

【原創】銳捷AM5532宿舍AP接口狀態智能巡檢實戰:Python腳本+Excel報表+QQ自動推送,某高校落地案例

? 項目已穩定運行 180+ 天,累計巡檢 14 萬接口,郵件告警 0 漏報 ?? CSDN 質量分 5.0 標準:代碼 + 圖表 + 可落地 + 可復制, 歡迎收藏、點贊、評論三連! 一、背景 某 高校學生宿舍采用銳捷 RG-AM5532 系列交換機下掛無線 AP,高峰期 2.4 萬終端并發。 網絡中心痛點: …

用戶、組和目錄的磁盤配額

一、XFS_quota限制用戶和組的容量&#xff08;block&#xff09;與文件數量&#xff08;inode&#xff09;&#xff1b;限制block就限制了用戶可以使用的磁盤容量&#xff0c;限制inode就可以限制用戶新建的文件數量限制某一目錄的最大磁盤配額&#xff08;directory project&a…

[GESP202506 五級] 最大公因數

題目描述 對于兩個正整數 a,ba,ba,b&#xff0c;他們的最大公因數記為 gcd?(a,b)\gcd(a,b)gcd(a,b)。對于 k>3k > 3k>3 個正整數 c1,c2,…,ckc_1,c_2,\dots,c_kc1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a; gcd?(c1,c2,…,ck)gcd?(gcd?(c1,c2,……

實現一個進程池(精講)

目錄 寫進程池前的理論掃盲 進程池的實現 寫進程池前的理論掃盲 父進程創建子進程&#xff0c;父子倆都看見同一片資源&#xff0c;這片資源被倆進程利用&#xff0c;用來通信&#xff0c;這片資源就是管道&#xff0c;如圖所示&#xff0c;能很好地詮釋管道。 那么什么是進程…

【tips】css模仿矢量圖透明背景

就像棋盤格background-image: linear-gradient(45deg, #f0f0f0 25%, transparent 25%), linear-gradient(-45deg, #f0f0f0 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #f0f0f0 75%), linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);background-…

visual studio 歷史版本安裝

visual studio 歷史版本安裝 鏈接&#xff1a;Visual Studio 版本路線圖 說明&#xff1a;該頁面提供歷史版本的發布說明及下載鏈接&#xff08;需滾動至頁面底部查找相關版本&#xff09;。例如&#xff0c;2022 版本可能包含 17.0 至 17.14 等子版本&#xff0c;用戶可根據需…

微軟推出“憤怒計劃“:利用AI工具實現惡意軟件自主分類

微軟周二宣布推出一款能夠自主分析并分類軟件的人工智能&#xff08;AI&#xff09;代理系統&#xff0c;旨在提升惡意軟件檢測能力。這款基于大語言模型&#xff08;LLM&#xff09;的自主惡意軟件分類系統目前仍處于原型階段&#xff0c;被微軟內部代號命名為"憤怒計劃&…

SOLIDWORKS Electrical:實現真正意義上的機電協同設計

隨著市場的發展&#xff0c;企業面臨兩個方面的挑戰&#xff1a;從業務和市場方面來看&#xff0c;為了在競爭中取得更大優勢&#xff0c;需要更高質量的產品&#xff0c;較低的成本并縮短產品上市周期&#xff1b;從設計和技術方面來看&#xff0c;產品的集成度越來越高&#…

MySql_忘記了root密碼怎么辦

《MySql_忘記了root密碼怎么辦》在忘記root密碼的時候&#xff0c;可以按以下步驟處理&#xff08;以windows為例&#xff09;。_1) 關閉正在運行的MySQL服務。_2) 打開DOS窗口&#xff0c;轉到mysql\bin目錄。_3) 輸入mysqld –skip-grant-tables 回車。–skip-grant-tables 的…

wstool和catkin_tools工具介紹

好的&#xff0c;我們來詳細介紹一下 python3-wstool 和 python3-catkin-tools 這兩個在 ROS (Robot Operating System) 開發中非常重要的工具&#xff0c;以及它們之間的關系。 首先&#xff0c;python3- 這個前綴表示這些是針對 Python 3 的軟件包版本&#xff0c;這在現代 R…

吳恩達 深度學習筆記

最近在看吳恩達深度學習系列課程&#xff0c;簡單做一個基本框架筆記。 如感興趣或了解更多內容&#xff0c;推薦看原課程 以前也做過一些與機器學習和深度學習有關的筆記&#xff0c;過分重復的就一筆帶過了。 01 第一門課 神經網絡和深度學習 1.1 第一周&#xff1a;深度學習…

2025數字馬力一面面經(社)

2025數字馬力一面面經&#xff08;社&#xff09; 日常自我介紹js數據類型有哪些&#xff08;報完菜名后簡單分析了一下使用引用類型&#xff09;談談對const、var、let的理解&#xff08;變量提升、let和const的主要區別、使用const命名引用類型的時可以對引用類型進行操作&am…

PyQt 中 pyqtSignal 的使用

目錄 基本用法 示例代碼 關鍵特性 常見用途 一、信號的定義規則 二、完整用法步驟 1. 導入必要模塊 2. 定義帶信號的類 3. 定義接收信號的槽函數 4. 連接信號與槽 5. 發射信號 6. 斷開連接(可選) 三、高級特性 1. 跨線程通信 2. 信號連接方式 3. 信號與匿名函數 4. 信號轉發 …

使用Python驗證常見的50個正則表達式

什么是正則表達式&#xff1f;正則表達式&#xff08;Regular Expression&#xff09;通常被用來檢索、替換那些符合某個模式(規則)的文本。此處的Regular即是規則、規律的意思&#xff0c;Regular Expression即“描述某種規則的表達式”之意。本文收集了一些常見的正則表達式用…

Redis是單線程性能還高的原因

Redis是單線程Redis單線程是指Redis的網絡IO和鍵值對讀寫是由一個線程完成的,其他功能還是使用多線程執行Redis主干業務使用單線程的原因Redis本質就是一個大的共享資源,共享資源是需要對其進行并發控制的,即使增加了線程,大部分線程也是在等待互斥鎖,并行變串行,而且還需要進行…

若依前后端分離版學習筆記(七)—— Mybatis,分頁,數據源的配置及使用

一 Mybatis 1、Maven依賴 在ruoyi父項目的pom文件中有一個分頁插件的依賴 <!-- pagehelper 分頁插件 --> <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version&…

灌區信息化智能管理系統解決方案

一、方案背景 灌區作為農業灌溉的重要基礎設施&#xff0c;承擔著保障糧食安全和促進農業可持續發展的關鍵作用。然而&#xff0c;傳統灌區管理方式普遍存在信息孤島、數據滯后、調度不精準等問題&#xff0c;導致水資源浪費和管理效率低下。在此背景下&#xff0c;灌區信息化智…

軟件包管理、緩存、自定義 YUM 源

1. 軟件包管理是啥 你可以把軟件包管理器理解成 Linux 的“應用商店 安裝工人”&#xff1a; 應用商店&#xff1a;幫你找到軟件&#xff08;包&#xff09;安裝工人&#xff1a;幫你下載安裝、配置、升級、卸載管理賬本&#xff1a;記錄系統里都安裝了啥、版本號是多少、依賴…