【Linux】GDB/CGDB 調試器學習筆記

GDB/CGDB 調試器學習筆記


🚀 前言

GDB 是 GNU 項目下功能強大的命令行調試器,適用于 C/C++ 等多種語言。CGDB 則是在 GDB 之上構建的輕量級 curses 界面,適合喜歡終端操作且習慣 vi 風格的人。


一、GDB 入門篇

1. 編譯時帶調試信息

gcc -g -O0 -Wall -o myprog myprog.c

其中:

  • -g:生成調試信息;
  • -O0:關閉優化,調試體驗更準確 ([Red Hat Developers][1])。

2. 啟動 GDB

最基本的啟動方式:

gdb myprog
(gdb) run

也可以附加參數:

gdb --args myprog arg1 arg2

3. 常用命令

命令作用
help / apropos查看命令幫助
break LOCATION (b)設置斷點
run (r)運行程序
next (n)單步,不進入函數
step (s)單步,進入函數
continue (c)繼續運行到下一個斷點
print VAR (p)打印變量值
info locals/args/breakpoints查看本地變量、參數、斷點信息
watch VAR監視變量讀寫 ([TechBeamers][2], [Stanford University][3])
  • list (l): 顯示當前源代碼附近幾行 ([Stanford University][3])。
  • p arr@count: 打印數組或指針連續元素 ([Stanford University][3])。

4. 多線程 & 回溯調試

  • 調試多線程:使用 info threads 查看線程;結合 watch 可觀察線程變量讀寫 。
  • 可逆調試(reverse debugging):支持 reverse-continue (rc)reverse-step (rs) 等命令,回溯執行路徑 ([Stack Overflow][4])。

二、CGDB:GDB 的終端 GUI 增強

1. CGDB 簡介

CGDB 是基于 curses 的終端調試界面,提供源代碼與 GDB 窗口的分屏顯示,鍵盤操作類似 vi ([cgdb.github.io][5])。

2. 安裝方法

一般用源碼編譯:

./configure
make
sudo make install

依賴 ncursesreadline ([heather.cs.ucdavis.edu][6])。

3. 快速入門操作

  • 啟動:cgdb myprog

  • 窗口之間切換:

    • 源碼窗:按 Esc
    • GDB 窗:按 i ([cgdb.github.io][5], [Siddharth’s Blog][7])。
  • 設置斷點:源碼窗中移動光標,按 space

  • 調整源碼窗大小:用 -=

  • 常用 GDB 命令:在 GDB 窗中使用 b, n, s, c, bt, info threads 等 ([cseweb.ucsd.edu][8], [Android blog][9])。

4. 為什么使用 CGDB?

  • 比 GDB 的 TUI 模式更穩定、有顏色顯示 ([heather.cs.ucdavis.edu][6])。
  • 操作流暢、界面簡潔,適合 SSH 終端環境。
  • 支持正則搜索、語法高亮、滾動命令歷史、Tab 補全等 ([cgdb.github.io][5])。

三、高級技巧與定制篇

1. .gdbinit 與自動加載

  • 啟用歷史記錄:

    set history save on
    set history size 10000
    set history filename ~/.gdb_history
    
  • 支持自動加載本地文件:

    add-auto-load-safe-path .
    

  • 項目級 .gdbinit:通過 gdb -x project.gdbinit 加載,方便團隊共享 ([Interrupt][10])。

2. 條件斷點、命令、watchpoint

  • 條件斷點:

    break foo if count > 100
    
  • 在斷點上附加命令:

    break foo
    commandsprint xcontinue
    end
    
  • 動態監視變量讀寫:watch varwatch -l var ([Reddit][11])。

3. Python 腳本 & 自定義宏

  • 使用 GDB Python API,編寫自定義命令和輸出美化功能 ([Reddit][12])。
  • 示例:定義函數 my_function 自動打印 $arg0,能在斷點時執行一系列操作 ([Medium][13])。

4. Pretty Printers & 插件

  • 利用 pretty-printer 美化 STL、protobuf 等復雜結構 。
  • 安裝插件如 GEF、pwndbg 來擴展內存剖析、反匯編能力 。

5. 核心轉儲 & 遠程調試

  • 使用 gdb myprog --core core.1234 查看崩潰現場 ([Red Hat Developers][1])。
  • 使用 gdbserver + target remote 實現遠端目標調試。

6. 腳本化 & 批處理

  • 啟動時預設命令:

    gdb -ex "break main" -ex run myprog
    
  • 使用 -batch 模式運行腳本并自動退出,適用于 CI 環境 。


四、延伸

以下是關于 Red?Hat 系列 GDB 教程Interrupt(由?Memfault 發布)的進階技巧與 .gdbinit 配置 的詳細介紹。


4.1 Red?Hat 系列 GDB 教程

Red?Hat 提供了一套結構清晰、由淺入深的 GDB 教學系列,適合從入門到進階的用戶。

1. 初學者指南 ? “Getting started with the debugger”(第一篇)
  • 作者:Keith Seitz,發表于?2021?年4月?30日。

  • 涵蓋 GDB 的基礎使用流程,包括:

    • 使用 gcc -g3 -O0 編譯以生成完整調試信息;
    • 通過 helpapropos 探索 GDB 命令;
    • 幫助新用戶移除命令分頁、打開歷史記錄等設置 ([Red Hat Developers][1], [Stanford University][2])。
2. Printf 樣式調試 ? “Printf?style debugging using GDB, Part 3”
  • 作者:Kevin Buettner,發表于?2021?年12月?9日。

  • 展示如何使用斷點觸發函數調用,例如:

    • 設置 break insert
    • 使用 GDB 命令在每次斷點觸發時自動調用程序內部的打印函數,實現“打印式”調試 ([Red Hat Developers][3])。
3. 逆向執行與時間旅行 ? “Using GDB to time travel” 和 “Advanced time manipulation with GDB”
  • 最新一篇發表于?2025?年6月?4日,由 Guinevere Larsen 撰寫。
  • 展示 GDB 的逆向調試功能 —— 如 record stopreverse-continue 等命令。
  • 介紹使用“時間循環”調試隨機行為程序(例如游戲中的 hit/miss 邏輯) ([Red Hat Developers][4])。

總結:Red?Hat 教程覆蓋了從編譯、斷點與打印調試、命令自動化,再到逆向調試的完整流程,非常適合構建扎實調試能力。


4.2 Interrupt:Memfault 的進階 GDB 使用技巧 & .gdbinit

由 Memfault 發布的文章“Advanced GDB Usage”深入提升調試效率,提供大量技巧和 .gdbinit 配置建議 ([Interrupt][5])。

核心亮點包括:
1. apropos 搜索命令

通過:

(gdb) apropos regex

快速查找相關命令,尤其適用于超過1500條 GDB 指令環境 。

2. 啟用命令歷史記錄

.gdbinit 中加入:

set history save on
set history size 10000
set history filename ~/.gdb_history

支持 Ctrl+R 進行交互式命令搜索 ([Interrupt][5])。

3. 項目級 .gdbinit 自動加載

建議為團隊創建統一的 .gdbinit,并通過腳本或 CLI 工具加載:

gdb -ix project.gdbinit myprog

便于共享宏、插件、加載配置 ([Interrupt][5])。

4. 源碼路徑映射

在代碼路徑不一致時,使用:

set substitute-path <orig> <local>
directory /local/src/…

確保調試器能正確定位源代碼 。

5. 條件斷點與 watchpoint
  • 條件斷點示例:

    break foo if count > 100
    
  • watchpoint 示例:

    watch var
    watch -l var
    

可指定變量被 “讀/寫” 時觸發 ([Stack Overflow][6])。

6. Pretty?printers 與 Python 腳本
  • 自定義打印復雜結構(如 STL、protobuf);
  • 使用 Python API 編寫命令或自動化腳本。
7. 多線程調試 & Backtrace for All Threads

使用 thread apply all backtrace 展示所有線程堆棧;適合 RTOS / 嵌入式環境調試 ([Medium][7], [Interrupt][8])。

8. 插件支持

推薦使用 GEF、pwndbg 等插件增強 GDB,包括內存剖析、匯編視圖等功能。


4.3 .gdbinit 示例模板

# 啟用歷史記錄
set history save on
set history size 10000
set history filename ~/.gdb_history# 禁用分頁
set pagination off# 自動加載本地 init 文件
add-auto-load-safe-path .# 源碼路徑映射
set substitute-path /build/dir /home/dev/project
directory /home/dev/project/src# 常用斷點宏
define bpfuncbreak $arg0commandssilentbacktracecontinueend
end# Condition breakpoint 示例
# break process_data if data_size > 1024# Watchpoint 示例
# watch -l config# 加載 pretty?printer 和插件
# source ~/gef/gef.py
# source ~/pwndbg/gdbinit.py

可以將此內容保存為 ~/.gdbinit(或項目下的 project.gdbinit),并通過 gdb -ix project.gdbinit 加載。


4.4 小結

資源內容重點
Red?Hat GDB 教程從基礎編譯、printf 風格調試到逆向調試,內容循序漸進。
Interrupt (Memfault)高效調試實用技巧:命令歷史、源碼映射、watchpoint、Python 自動化、插件支持等全面覆蓋。

推薦做法:

  1. 先閱讀 Red?Hat 系列建立基礎;
  2. 再應用 Interrupt 的 .gdbinit 和高級操作;
  3. 最后通過 Python 腳本 + 插件(如 GEF/pwndbg)定制調試工具鏈。

5 參考資料

[1]: https://developers.redhat.com/articles/the-gdb-developers-gnu-debugger-tutorial-part-1-getting-started-with-the-debugger?utm_source=chatgpt.com "Get Started with our GNU Debugger Tutorial - Red Hat Developer"
[2]: https://web.stanford.edu/class/archive/cs/cs107/cs107.1194/resources/gdb?utm_source=chatgpt.com "CS107 GDB and Debugging"
[3]: https://developers.redhat.com/articles/2021/12/09/printf-style-debugging-using-gdb-part-3?utm_source=chatgpt.com "Printf-style debugging using GDB, Part 3 - Red Hat Developer"
[4]: https://developers.redhat.com/articles/2025/06/04/advanced-time-manipulation-gdb?utm_source=chatgpt.com "Advanced time manipulation with GDB - Red Hat Developer"
[5]: https://interrupt.memfault.com/blog/advanced-gdb?utm_source=chatgpt.com "Advanced GDB Usage - Interrupt - Memfault"
[6]: https://stackoverflow.com/questions/71966464/gdbs-gdbinit-issues-annoying-feedback-when-focus-cmd-is-used?utm_source=chatgpt.com "GDB's .gdbinit issues annoying feedback when \"focus cmd\" is used"
[7]: https://olof-astrand.medium.com/advanced-debugging-with-gdb-reverse-execution-pretty-printer-and-asan-b27ef335d036?utm_source=chatgpt.com "Advanced debugging with gdb (Reverse execution , Pretty-Printer ..."
[8]: https://community.memfault.com/t/advanced-gdb-usage-interrupt/284?utm_source=chatgpt.com "Advanced GDB Usage | Interrupt - Blog"[1]: https://developers.redhat.com/articles/the-gdb-developers-gnu-debugger-tutorial-part-1-getting-started-with-the-debugger?utm_source=chatgpt.com "Get Started with our GNU Debugger Tutorial - Red Hat Developer"
[2]: https://techbeamers.com/how-to-use-gdb-top-debugging-tips/?utm_source=chatgpt.com "GDB Tutorial: Essential GDB Tips to Learn Debugging - TechBeamers"
[3]: https://web.stanford.edu/class/archive/cs/cs107/cs107.1258/resources/gdb.html?utm_source=chatgpt.com "CS107 GDB and Debugging - Stanford University"
[4]: https://stackoverflow.com/questions/1471226/most-tricky-useful-commands-for-gdb-debugger?utm_source=chatgpt.com "Most tricky/useful commands for gdb debugger - Stack Overflow"
[5]: https://cgdb.github.io/docs/cgdb.html?utm_source=chatgpt.com "CGDB Manual 0.8.0"
[6]: https://heather.cs.ucdavis.edu/~matloff/cgdb.html?utm_source=chatgpt.com "A Quick-Start Tutorial on the CGDB Debugging Interface"
[7]: https://r3x.github.io/posts/gdb_advanced/?utm_source=chatgpt.com "Advanced GDB Debugging - Siddharth Muralee"
[8]: https://cseweb.ucsd.edu/classes/fa09/cse141/tutorial_gcc_gdb.html?utm_source=chatgpt.com "Tutorial of gcc and gdb - UCSD CSE"
[9]: https://mhandroid.wordpress.com/2011/01/23/using-cgdb-with-ndk-debug-and-cgdb-tutorial/?utm_source=chatgpt.com "Using cgdb with ndk-debug (and cgdb tutorial) - Android blog"
[10]: https://interrupt.memfault.com/blog/advanced-gdb?utm_source=chatgpt.com "Advanced GDB Usage - Interrupt - Memfault"
[11]: https://www.reddit.com/r/C_Programming/comments/13tyt0z/a_quick_intro_to_gdb/?utm_source=chatgpt.com "A quick intro to gdb. : r/C_Programming - Reddit"
[12]: https://www.reddit.com/r/cpp/comments/iw3h9w/protips_for_gdb/?utm_source=chatgpt.com "Protips for GDB? : r/cpp - Reddit"
[13]: https://altmannmarcelo.medium.com/gdb-advanced-techniques-expanding-gdb-functionality-with-custom-function-execution-ccf50894f61b?utm_source=chatgpt.com "GDB Advanced Techniques: Expanding GDB Functionality with ..."

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

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

相關文章

鏈接代理后無法訪問網絡

路由方向的問題 cmd 輸入 route print 查看路由多了一個不是你網絡的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 參考這個 固定ip if是代理鏈路的 鏈路口又敏感詞這個文章不合規兩次評論區問我

day37 早停策略和模型權重的保存

DAY 37 我今天的筆記是用cpu訓練的&#xff0c;請自行修改為gpu訓練 仍然是循序漸進&#xff0c;先復習之前的代碼 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

網絡爬蟲分類全解析

網絡爬蟲作為數據獲取的重要工具,其分類方式多樣,不同類型的爬蟲在技術實現、應用場景和功能特性上存在顯著差異。深入理解這些分類,有助于開發者根據實際需求選擇合適的爬蟲方案。本文將從技術特性、應用場景和架構設計三個維度,系統介紹網絡爬蟲的主要分類。 一、按技術…

ECR倉庫CloudFormation模板完整指南

概述 本文檔詳細介紹了一個通用的Amazon ECR(Elastic Container Registry)倉庫CloudFormation模板,該模板支持多業務組、參數化配置,并包含完整的安全策略、生命周期管理和監控功能。 模板特性 核心功能 ? 支持4個業務組:app、ai、mall、frontend? 靈活的服務名手動輸…

C++(STL源碼刨析/List)

一 List 核心字段和接口1. 節點字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 鏈表 不是連續的內存塊&#xff0c;所以對每一個申請到的內存塊要進行統一組織&#xff0c;也就是封裝成一個類…

蘋果App上架流程:不用Mac也可以上架的方法

iOS App 的上架流程一直被認為是門檻最高、流程最繁瑣的移動端工作之一。對很多使用 Windows 或 Linux 進行開發的跨平臺團隊來說&#xff0c;Mac 的缺位更放大了每一步的難度。 在我們近期為一款本地生活類 App 進行 iOS 上架時&#xff0c;團隊成員幾乎沒有配備本地 Mac&…

【爬蟲】- 爬蟲原理及其入門

爬蟲01 - 爬蟲原理及其入門 文章目錄爬蟲01 - 爬蟲原理及其入門一&#xff1a;爬蟲原理1&#xff1a;爬蟲的優勢?2&#xff1a;爬蟲的核心庫3&#xff1a;經典舉例4&#xff1a;合規問題一&#xff1a;爬蟲原理 學習爬蟲之前前置知識需要了解這些&#xff1a; 我的HTTP介紹, 了…

G5打卡——Pix2Pix算法

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 Pix2Pix 是一種基于條件生成對抗網絡&#xff08;cGANs&#xff09;的圖像到圖像翻譯算法&#xff0c;由 Phillip Isola 等人在 2016 年提出。該算法的核心思想…

動力系統模擬與推導-AI云計算數值分析和代碼驗證

當系統是連續的&#xff0c;并且其狀態變量不僅隨時間變化&#xff0c;而且隨空間維度變化時&#xff0c;需要使用偏微分方程&#xff08;PDEs&#xff09;來推導運動方程。偏微分方程提供了描述這些空間分布屬性如何相互作用和演化的數學框架。 選擇使用常微分方程&#xff08…

P4597 序列 sequence題解

P4597 序列 sequence 給定一個數列&#xff0c;每次操作可以使任意一個數1或-1&#xff0c;求小的操作次數&#xff0c;使得數列變成不降數列. 1.對于前面比當前位的數字大的數&#xff0c;設最大數為 xxx &#xff0c;當前的數為 yyy ,則對于 xxx 到 yyy 中間的任意數&#xf…

雨污管網智慧監測系統網絡建設方案:基于SD-WAN混合架構的最佳實踐

隨著城市化的快速推進&#xff0c;雨污管網的管理與運行面臨著日益復雜的挑戰&#xff0c;例如內澇、污水溢流、非法排污等問題頻發。為了更高效地管理分布廣泛的監測點&#xff0c;保障系統運行穩定性&#xff0c;構建一套高效、低成本、易運維的網絡架構至關重要。本文將分享…

世俱杯直播數據源通過反匯編獲取到

在當今的互聯網體育賽事直播中&#xff0c;許多平臺為了保護其直播資源&#xff0c;會采用加密、混淆或動態加載等方式隱藏真實的視頻流地址&#xff08;如 .m3u8 或 .flv&#xff09;。對于普通用戶和開發者來說&#xff0c;直接通過網頁源碼或瀏覽器調試器難以快速定位這些關…

字節豆包又一個新功能,超級實用,4 種玩法,你肯定用得上!(建議收藏)

前段時間&#xff0c;分享了一個非常好用的視頻總結工具——百度網盤和百度文庫聯合推出的「AI 筆記」。它能自動根據視頻內容&#xff0c;生成圖文視頻總結、表格總結、思維導圖等。關鍵是帶時間戳&#xff0c;能直接跳轉到視頻的位置。但這個功能隱藏在百度網盤里&#xff0c…

AI進化論08:機器學習的崛起——數據和算法的“二人轉”,AI“悶聲發大財”

上回咱們聊了第二次AI寒冬&#xff0c;AI為了“活下去”&#xff0c;不得不“改頭換面”&#xff0c;從“AI”變成了“機器學習”。結果你猜怎么著&#xff1f;這“機器學習”啊&#xff0c;還真就“悶聲發大財”了&#xff01;它不再執著于模擬人類的“思維過程”&#xff0c;…

【MySQL】———— 索引

作者主頁&#xff1a; 作者主頁 本篇博客專欄&#xff1a;Linux 創作時間 &#xff1a;2025年7月11日 Mysql索引 索引介紹 索引是什么 根據官方對索引的介紹&#xff0c;索引是幫助MySQL高效的獲取數據的數據結構&#xff0c;在我看來&#xff0c;索引就相當于一本書的目…

頁面html,當鼠標點擊圖標,移開圖標,顏色方塊消失

html頁面代碼&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>顏色選擇器</title><style>body {font-family: "Microsoft YaHei", sans-serif;padding: 20px;}.c…

netdxf—— CAD c#二次開發之(netDxf 處理 DXF 文件)

1.創建新項目打開 VS2022&#xff0c;選擇 "創建新項目"搜索 "控制臺應用"&#xff0c;選擇 ".NET 6.0 (C#)" 模板&#xff0c;點擊 "下一步"項目名稱&#xff1a;"DxfProcessor"&#xff0c;位置&#xff1a;自選&#xff…

如何將一個本地的jar包安裝到 Maven 倉庫中

我們需要執行以下步驟&#xff1a; 首先&#xff0c;打開命令提示符&#xff08;CMD&#xff09;或 PowerShell&#xff0c;執行以下命令&#xff1a; mvn install:install-file ^ -Dfile"你的jar包路徑" ^ -DgroupId"組織ID" ^ -DartifactId"項目ID&…

AI賦能的企業音頻智能中樞:重構會議價值提升決策效率的數字化轉型實踐

在當今快節奏的商業環境中&#xff0c;企業管理者每天都要處理海量信息&#xff0c;其中音頻內容占據了重要位置。你是否經常遇到這樣的困擾&#xff1a;重要會議結束后&#xff0c;錄音文件靜靜躺在設備里&#xff0c;遲遲無法變成可用的會議紀要跨部門協作時&#xff0c;收到…

醫學+AI!湖北中醫藥大學信息工程學院與和鯨科技簽約101數智領航計劃

為積極推動人工智能與中醫藥信息化深度融合&#xff0c;著力培育既精通中醫藥理論又掌握人工智能技術的復合型人才&#xff0c;6 月 27 日&#xff0c;湖北中醫藥大學信息工程學院與上海和今信息科技有限公司&#xff08;以下簡稱 “和鯨科技”&#xff09;召開校企合作座談會&…