Linux系統編程Day9 -- gdb (linux)和lldb(macOS)調試工具

??往期內容回顧

????????Git 教程(初階)

????????基于Linux系統知識的第一個程序

????????自動化構建工具-make/Makefile

????????gcc/g++編譯及鏈接

????????Vim工具的使用

????????Linux常用工具(yum與vim)


一、??Linux 下的調試工具 GDB

????????一、為什么要學習 GDB?

  • ????????調試是開發不可或缺的環節,無論是初學編程還是開發大型項目,都難免會遇到程序崩潰、邏輯錯誤、死循環等問題。

  • GDB(GNU Debugger)是 Linux/Unix 下最常用的命令行調試工具,能幫助你精確定位問題所在。

  • 學會用 GDB,能極大提升排錯效率,節省大量調試時間。

  • 對于理解程序運行機制、學習底層細節也很有幫助。


????????二、什么是 GDB?

  • GDB 是 GNU 項目下的調試器,用于調試用 C、C++、Fortran 等語言編寫的程序。

  • 它允許你:

    • 運行程序并監控執行過程

    • 設置斷點暫停程序

    • 查看變量和內存內容


    • 單步執行代碼

    • 跟蹤調用棧

    • 修改變量值

  • GDB 是基于命令行的,但也有很多圖形前端(如 DDD、Nemiver、Eclipse 等)用來提升交互體驗


三、GDB 的基本使用

1. 編譯帶調試信息的程序

????????為了讓 GDB 能查看源碼信息,必須在編譯時加上?-g?參數:

gcc -g hello.c -o hello

原因:gcc/g++默認在編譯文件的時候,文件的版本為release版本,無法進行調試,在編譯時必須要 加上 -g允許gdb查看源碼才能進入調試模式。

gdb ./hello

2. 常用命令示例

命令

說明

run?/?r

啟動程序

break main?/?b main

在 main 函數設置斷點

break 文件名:行號

在指定行設置斷點

next?/?n

單步執行下一行(不進入函數內部)

step?/?s

單步執行,進入函數內部

continue?/?c

繼續運行直到下一個斷點或程序結束

print 變量名?/?p

打印變量值

info locals

查看當前函數所有局部變量

backtrace?/?bt

查看調用棧

list?/?l

查看源碼(當前行附近)

quit?/?q

退出 GDB


3、調試流程示例

(gdb) break main ? ? ? # 設置斷點

(gdb) break delete num? ? ? ?# 刪除第num個斷點
(gdb) run ? ? ? ? ? ? ?# 運行程序
(gdb) next ? ? ? ? ? ? # 執行下一行
(gdb) print x ? ? ? ? ?# 打印變量 x
(gdb) continue ? ? ? ? # 繼續執行
(gdb) backtrace ? ? ? ?# 查看調用棧
(gdb) quit ? ? ? ? ? ? # 退出

(gdb) p &x ? ? ? ? ? #查看變量的地址

(gdb) display x ? #變量的常顯示

(gdb)until ? num? ? ? ? ? ? ? #跳出循環至下一次有效代碼行num

(gdb) set var?sum = 10 ? ? ? ?# 修改變量值

(gdb)info locals ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#查看局部變量

四、總結

優點

適用場景

免費、開源、功能強大

C/C++ 程序調試

支持斷點、單步執行、變量查看

定位程序崩潰和邏輯錯誤

支持多線程、遠程調試

復雜項目調試

有豐富的命令集和腳本支持

自動化調試流程


二、macos下的調試工具LLDB

????????一、macOS 的 LLDB 簡介

1. 什么是 LLDB?

  • LLDB?是 Apple 推出的調試器,屬于 LLVM 項目的一部分。

  • 它是 macOS 和 iOS 平臺上的默認調試器,隨 Xcode 工具鏈安裝。

  • LLDB 設計現代化,支持最新的編譯器生成的調試信息(特別是 Clang/LLVM 生成的 DWARF)。

  • 原生支持 ARM64 (Apple Silicon) 架構,支持多線程、異步編程調試。


2. LLDB 與 GDB 的關系

  • LLDB 最初是為了替代 GDB 在蘋果生態的地位而開發的。

  • LLDB 和 GDB 在命令行風格上有很多相似之處,但內部架構不同。

  • LLDB 使用現代 C++ 編寫,集成 LLVM,調試效率和對新架構的支持更好。

  • GDB 作為 GNU 項目,歷史悠久,跨平臺廣泛,但 macOS 上對最新 Apple 硬件和編譯器支持不如 LLDB。


二、macOS LLDB 的安裝和啟動

  • 默認已經安裝:macOS 自帶 Xcode 或者 Xcode 命令行工具后,會自動安裝 LLDB。

  • 啟動 LLDB

lldb <program>

????????進入交互命令行界面,等待用戶輸入命令


三、LLDB 常用命令詳解

任務

LLDB 命令示例

說明

GDB 對應命令

啟動程序

run

運行程序

run?/?r

設置函數斷點

breakpoint set -n main?或?b main

在函數名?main?處設置斷點

break main

設置行斷點

breakpoint set -f file.c -l 42?或?b file.c:42

在文件?file.c?的第 42 行設置斷點

break file.c:42

列出斷點

breakpoint list?或?br list

列出所有斷點

info break

刪除斷點

breakpoint delete 1

刪除斷點編號 1

delete 1

單步執行(不進入函數)

next?或?n

單步執行,不進入函數

next?/?n

單步執行(進入函數)

step?或?s

單步執行,進入函數

step?/?s

繼續執行

continue?或?c

繼續執行直到下一個斷點或程序結束

continue?/?c

打印變量

print var?或?p var

打印變量值

print var?/?p var

查看調用棧

bt?或?thread backtrace

查看當前調用棧

backtrace?/?bt

查看源碼

list?或?l

查看當前代碼

list?/?l

退出調試

quit?或?q

退出調試器

quit?/?q


四、LLDB 的高級功能介紹

1. 對多線程的支持

  • LLDB 支持查看線程列表,切換線程,查看線程狀態:

thread list
thread select 2
thread info
  • GDB 也支持多線程,但 LLDB 對 macOS 和 ARM64 的線程調試更友好。

2. Watchpoint(監視點)

  • LLDB 支持對變量內存變化設置監視點:

watchpoint set variable myVar
  • 適合調試內存相關錯誤。

3. 表達式求值和腳本

  • LLDB 支持用 Python 腳本擴展功能。

  • 可以在調試時寫 Python 腳本執行復雜操作。

4. 代碼補全與命令歷史

LLDB 支持 tab 補全和命令歷史,比 GDB 交互體驗更好。


五、macOS LLDB 與 GDB 對比總結

特性/維度

LLDB (macOS)

GDB (macOS)

默認安裝

macOS 自帶,Xcode 自帶

需要自己安裝

支持架構

原生支持 ARM64 和 x86_64

主要支持 x86_64,ARM64 支持有限

調試符號支持

完美支持 Apple clang 生成的 DWARF 格式

對 Apple DWARF 支持不完全,常報錯

交互體驗

命令補全、腳本擴展、歷史記錄完善

較傳統,交互性不如 LLDB

多線程調試

優秀

支持,但不如 LLDB 友好

腳本支持

支持 Python

有腳本支持,但相對較弱

適用場景

macOS 和 iOS 開發首選調試器

Linux 和跨平臺項目常用

易用性

現代化,用戶體驗更好

歷史久遠,但命令更繁瑣


六、簡單 LLDB 調試流程示例

gcc -g -O0 gdb.c -o myprog ? # 編譯帶調試符號程序
lldb myprog ? ? ? ? ? ? ? ? # 啟動 lldb 調試器

(lldb) b main ? ? ? ? ? ? ? # 在 main 函數設置斷點
(lldb) run ? ? ? ? ? ? ? ? ?# 運行程序
(lldb) n ? ? ? ? ? ? ? ? ? ?# 單步,不進入函數
(lldb) s ? ? ? ? ? ? ? ? ? ?# 單步,進入函數
(lldb) p var ? ? ? ? ? ? ? ?# 打印變量
(lldb) bt ? ? ? ? ? ? ? ? ? # 查看調用棧
(lldb) c ? ? ? ? ? ? ? ? ? ?# 繼續運行至下一個斷點b
(lldb) q ? ? ? ? ? ? ? ? ? ?# 退出

(lldb) display x ? ? #變量的常顯示

(lldb)until ? num? ? ? ? ? ? ? #跳出循環至下一次有效代碼行num

(lldb) expr sum = 10 ? ? ? ?# 修改變量值

(lldb) frame variable ? ? ? ? #查看當前函數的所有局部變量


七、總結

  • 在 macOS 上調試,強烈推薦用 LLDB。

  • LLDB 對 macOS 和 Apple Silicon 有天然支持,調試體驗比 GDB 好很多。

  • GDB 雖然經典且跨平臺,但在 macOS 上使用常碰到架構兼容性和調試信息格式問題。

  • 如果你熟悉 GDB 命令,LLDB 也能快速上手,命令基本兼容,還支持更多現代功能。

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

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

相關文章

數據結構(17)排序(下)

一、計數排序計數排序又稱為鴿巢原理&#xff0c;是對哈希直接定址法的變形應用。操作步驟如下&#xff1a;①統計相同元素出現的次數 ②根據統計的結果將序列回收到原來的序列中比如&#xff0c;現在有一個數組{6,1,2,9,4,2,4,1,4}。該數組中&#xff0c;元素1出現兩次&#…

深度解析 Spring Boot 循環依賴:原理、源碼與解決方案

在 Spring Boot 開發中,循環依賴是一個常見且容易被忽視的技術點。當兩個或多個 Bean 相互引用時,就會形成循環依賴(如 A 依賴 B,B 依賴 A)。初學者往往會困惑:Spring 為什么能自動處理這種看似矛盾的依賴關系?本文將從原理、源碼實現到解決方案,全方位剖析 Spring Boo…

數據庫的基本操作(約束與DQL查詢)

一、約束約束是在表上強制執行的數據規則&#xff0c;用于確保數據的完整性和一致性&#xff08;1&#xff09;約束類型MySQL中支持多種約束類型&#xff1a;①主鍵約束&#xff08;PRIMARY KEY&#xff09; ②自增約束&#xff08;AUTO_INCREMENT&#xff09;③非空約束…

HP Pavilion G6 筆記本安裝Ubuntu開機后自動進入飛行模式的問題解決

問題一臺HP Pavilion G6 筆記本 &#xff0c;安裝了Ubuntu24.04版本&#xff0c;開機后&#xff0c;直接進入飛行模式&#xff0c;導致無法使用Wifi,且使用fnf10的組合鍵&#xff0c;也無法關閉飛行模式。使用fnf10鍵&#xff0c;可以看到提示顯示飛行模式&#xff0c;但無法關…

LLM:MoE原理與實現探索

文章目錄前言一、Deepseek Moe二. Moe架構1. Expert2. Gate3. MoE Module三、Auxiliary Loss總結前言 MoE&#xff08;Mixture of Experts) 已經逐漸在LLM中廣泛應用&#xff0c;其工程部署相關目前也有了越來越多的支持&#xff0c;本文主要記錄一下MoE的基本模塊構造與原理。…

基于領域事件驅動的微服務架構設計與實踐

引言&#xff1a;為什么你的微服務總是"牽一發而動全身"&#xff1f; 在復雜的業務系統中&#xff0c;你是否遇到過這樣的困境&#xff1a;修改一個訂單服務&#xff0c;卻導致支付服務異常&#xff1b;調整庫存邏輯&#xff0c;用戶服務開始報錯。這種"蝴蝶效應…

如何使用curl編程來下載文件

libcurl 是一個功能強大的跨平臺網絡傳輸庫&#xff0c;支持多種協議。 本篇來介紹libcul的C語言編程&#xff0c;實現一個文件下載的功能。 1 curl基礎介紹 1.1 核心數據結構 1.1.1 CURL句柄 CURL是libcurl 的核心句柄&#xff0c;每個請求對應一個 CURL 實例&#xff0c;…

大語言模型提示工程與應用:ChatGPT提示工程技術指南

ChatGPT提示工程 學習目標 在本課程中&#xff0c;我們將學習更多關于ChatGPT的最新提示工程技術。 相關知識點 ChatGPT提示工程 學習內容 1 ChatGPT提示工程 ChatGPT是OpenAI研發的新型對話模型&#xff0c;具備多輪對話能力。該模型通過人類反饋強化學習(RLHF)訓練&am…

能力評估:如何系統評估你的技能和經驗

能力評估&#xff1a;如何系統評估你的技能和經驗 作為一名38歲的互聯網研發老兵&#xff0c;你已經積累了豐富的經驗&#xff0c;包括技術深度、項目管理、團隊協作等。但能力評估不是一次性事件&#xff0c;而是持續過程&#xff0c;幫助你識別優勢、短板&#xff0c;并為職業…

鴻蒙開發中所有自定義裝飾器的完整案例解析--涵蓋 16 個核心裝飾器的詳細用法和實戰場景

以下是鴻蒙開發中 所有自定義裝飾器的完整案例解析 和 終極總結指南&#xff0c;涵蓋 16 個核心裝飾器的詳細用法和實戰場景&#xff1a; 一、終極總結表&#xff1a;16大裝飾器全景圖 裝飾器類別V1V2核心作用典型場景Component組件定義??創建標準組件業務UI組件ComponentV2…

【C++】哈希表的實現(unordered_map和unordered_set的底層)

文章目錄 目錄 文章目錄 前言 一、unordered_set和unordered_map介紹 二、哈希表的介紹 三、哈希沖突的解決方法 1.開放定址法 2.鏈地址法 四、兩種哈希表代碼實現 總結 前言 前面我們學習了紅黑樹&#xff0c;紅黑樹就是map和set的底層&#xff0c;本篇文章帶來的是unordered…

歐拉公式的意義

歐拉公式的意義 歐拉公式&#xff08;Euler’s Formula&#xff09;是數學中最重要的公式之一&#xff0c;它將復數、指數函數和三角函數緊密聯系在一起。其基本形式為&#xff1a; eiθcos?θisin?θ e^{i\theta} \cos \theta i \sin \theta eiθcosθisinθ 當 θπ\thet…

Linux Docker 運行SQL Server

在Linux操作系統&#xff0c;已安裝docker&#xff0c;現在以docker compose方式&#xff0c;安裝一個最新版SQL Server 2022的數據庫。 # 建個目錄&#xff08;請不要照抄&#xff0c;我的數據盤在/data&#xff0c;你可以改為/opt&#xff09; mkdir /data/sqlserver# 進入目…

C++:stack_queue(2)實現底層

文章目錄一.容器適配器1. 本質&#xff1a;2. 接口&#xff1a;3. 迭代器&#xff1a;4. 功能&#xff1a;二.deque的簡單介紹1.概念與特性2.結構與底層邏輯2.1 雙端隊列&#xff08;deque&#xff09;結構&#xff1a;2.2 deque的內部結構2.3 deque的插入與刪除操作&#xff1…

Lightroom 安卓版 + Windows 版 + Mac 版全適配,編輯管理一站式,專業攝影后期教程

軟件是啥樣的? Adobe Lightroom 這軟件&#xff0c;在安卓手機、Windows 電腦和 Mac 電腦上都能用。不管是喜歡拍照的人&#xff0c;還是專門搞攝影的&#xff0c;用它都挺方便&#xff0c;能一站式搞定照片編輯、整理和分享這些事兒。 ****下載地址 分享文件&#xff1a;【Li…

office卸載不干凈?Office356卸載不干凈,office強力卸載軟件下載

微軟官方認可的卸載工具&#xff0c;支持徹底清除Office組件及注冊表殘留。需要以管理員身份運行&#xff0c;選擇“移除Office”功能并確認操作。 Office Tool Plus安裝地址獲取 點擊這里獲取&#xff1a;Office Tool Plus 1、雙擊打開軟件 image 2、選擇左右的工具箱&…

互聯網企業慢性死亡的招聘視角分析:從崗位割裂看戰略短視

內容簡介&#xff1a; 一個獵頭和HR的簡單拒絕&#xff0c;揭示了中國互聯網企業人才觀念的深層問題。通過分析崗位過度細分現象&#xff0c;本文探討了戰略短視、內斗文化和核心競爭力缺失如何導致企業慢性死亡&#xff0c;并提出了系統性的解決方案。#互聯網企業 #人才招聘 #…

OpenBMC中phosphor-dbus-interfaces深度解析:架構、原理與應用實踐

引言 在OpenBMC生態系統中&#xff0c;phosphor-dbus-interfaces作為D-Bus接口定義的核心組件&#xff0c;扮演著系統各模塊間通信"契約"的關鍵角色。本文將基于OpenBMC源碼&#xff0c;從架構設計、實現原理到實際應用三個維度&#xff0c;全面剖析這一基礎組件的技…

駕駛場景玩手機識別準確率↑32%:陌訊動態特征融合算法實戰解析

原創聲明本文為原創技術解析文章&#xff0c;核心技術參數與架構設計參考自《陌訊技術白皮書》&#xff0c;轉載請注明出處。一、行業痛點&#xff1a;駕駛場景行為識別的現實挑戰根據交通運輸部道路運輸司發布的《駕駛員不安全行為研究報告》顯示&#xff0c;駕駛過程中使用手…

Mysql——單表最多數據量多少需要分表

目錄 一、MySql單表最多數據量多少需要分表 1.1、阿里開發公約 1.2、一個三層的B+樹,它最多可以存儲多少數據量 1.3、示例 1.3.1、示例表中一行的數據占多少字節數 1.3.2、示例表中一頁里面最多可以存多少條記錄 1.3.3、按示例表計算,一個三層的B+樹,可以放多少條100字節的數…