搜尋
首頁系統教程Linux深入探討Linux調試器的高階話題

深入探討Linux調試器的高階話題

Jan 08, 2024 pm 10:42 PM
linuxlinux教程紅帽linux系統linux指令linux認證紅帽linuxlinux視頻

導讀 我們終於來到這個系列的最後一篇文章!這次,我將對調試中的一些更高級的概念進行高層的概述:遠端調試、共享庫支援、表達式計算和多線程支援。這些想法實現起來比較複雜,所以我不會詳細說明如何做,但是如果你有問題的話,我很樂意回答有關這些概念的問題。
系列索引
  1. 準備環境
  2. 斷點
  3. 暫存器和記憶體
  4. Elves 和 dwarves
  5. 原始碼和訊號
  6. 原始碼層逐步執行
  7. 原始碼層斷點
  8. 呼叫堆疊
  9. 處理變數
  10. 進階主題
遠端偵錯

遠端偵錯對於嵌入式系統或對不同環境進行偵錯非常有用。它還在高級偵錯器操作和與作業系統和硬體的互動之間設置了一個很好的分界線。事實上,像 GDB 和 LLDB 這樣的偵錯器即使在偵錯本機程式時也可以作為遠端偵錯器運行。一般架構是這樣的:
Linux 调试器之高级主题!

debugarch

#調試器是我們透過命令列互動的元件。也許如果你使用的是 IDE,那麼在其上有另一個層可以透過機器介面與調試器進行通訊。在目標機器上(可能與本機一樣)有一個調試存根,理論上它是一個非常小的操作系統調試庫的包裝程序,它執行所有的低級調試任務,如在地址上設置斷點。我說“在理論上”,因為如今調試存根變得越來越大。例如,我機器上的 LLDB 偵錯存根大小是 7.6MB。調試存根透過使用一些特定於作業系統的功能(在我們的例子中是 ptrace)和被調試進程以及透過遠端協定的調試器通訊。
最常見的遠端調試協定是 GDB 遠端協定。這是一種基於文字的資料包格式,用於在偵錯器和調試存根之間傳遞命令和資訊。我不會詳細介紹它,但你可以在這裡進一步閱讀。如果你啟動 LLDB 並執行命令 log enable gdb-remote packets,那麼你將獲得透過遠端協定發送的所有資料包的追蹤資訊。在 GDB 上,你可以用 set remotelogfile 做同樣的事情。

作為一個簡單的例子,這是設定斷點的資料包:

$Z0,400570,1#43

$ 標記資料包的開始。 Z0 是插入記憶體斷點的命令。 400570 和 1 是參數,其中前者是設定斷點的位址,後者是特定目標的斷點類型說明符。最後,#43 是校驗值,以確保資料沒有損壞。

GDB 遠端協定非常易於擴展自訂資料包,這對於實現平台或語言特定的功能非常有用。

共享庫和動態載入支援

偵錯器需要知道被偵錯程式載入了哪些共用程式庫,以便它可以設定斷點、取得原始程式碼層級的資訊和符號等。除查找被動態連結的庫之外,偵錯器還必須追蹤在運行時透過 dlopen 載入的庫。為了達到這個目的,動態連結器維護一個 交會結構體。此結構體維護共享庫描述符的鍊錶,以及一個指向每當更新鍊錶時調用的函數的指標。這個結構儲存在 ELF 檔案的 .dynamic 段中,在程式執行之前被初始化。

一個簡單的追蹤演算法:

  • 追蹤程式在 ELF 頭中尋找程式的入口(或可以使用儲存在 /proc//aux 中的輔助向量)。
  • 追蹤程式在程式的入口處設定一個斷點,並開始執行。
  • 當到達斷點時,透過在 ELF 檔案中尋找 .dynamic 的載入位址找到交會結構體的位址。
  • 檢查交會結構體以取得目前載入的庫的清單。
  • 連結器更新函數上設定斷點。
  • 每當到達斷點時,清單都會更新。
  • 追蹤程式無限循環,繼續執行程式並等待訊號,直到追蹤程式訊號退出。

我給這些概念寫了一個小例子,你可以在這裡找到。如果有人有興趣,我可以將來寫得更詳細一點。

表達式計算

表達式計算是程式的一項功能,允許使用者在偵錯程式時對原始來源語言中的表達式進行計算。例如,在 LLDB 或 GDB 中,可以執行 print foo() 來呼叫 foo 函數並列印結果。

根據表達式的複雜程度,有幾種不同的計算方法。如果表達式只是一個簡單的標識符,那麼偵錯器可以查看偵錯訊息,找到該變數並列印該值,就像我們在本系列最後一部分中所做的那樣。如果表達式有點複雜,則可能將程式碼編譯成中間表達式 (IR) 並解釋以獲得結果。例如,對於某些表達式,LLDB 將使用 Clang 將表達式編譯為 LLVM IR 並將其解釋。如果表達式更複雜,或者需要呼叫某些函數,那麼程式碼可能需要 JIT 到目標並在被偵錯者的位址空間中執行。這涉及到調用 mmap 來分配一些可執行內存,然後將編譯的程式碼複製到該區塊並執行。 LLDB 透過使用 LLVM 的 JIT 功能來實現。

如果你想更了解 JIT 編譯,我強烈推薦 Eli Bendersky 關於這個主題的文章。

多线程调试支持

本系列展示的调试器仅支持单线程应用程序,但是为了调试大多数真实程序,多线程支持是非常需要的。支持这一点的最简单的方法是跟踪线程的创建,并解析 procfs 以获取所需的信息。

Linux 线程库称为 pthreads。当调用 pthread_create 时,库会使用 clone 系统调用来创建一个新的线程,我们可以用 ptrace 跟踪这个系统调用(假设你的内核早于 2.5.46)。为此,你需要在连接到调试器之后设置一些 ptrace 选项:

ptrace(PTRACE_SETOPTIONS, m_pid, nullptr, PTRACE_O_TRACECLONE);

现在当 clone 被调用时,该进程将收到我们的老朋友 SIGTRAP 信号。对于本系列中的调试器,你可以将一个例子添加到 handle_sigtrap 来处理新线程的创建:

case (SIGTRAP | (PTRACE_EVENT_CLONE 
<p>一旦收到了,你可以看看 /proc//task/ 并查看内存映射之类来获得所需的所有信息。</p>
<p>GDB 使用 libthread_db,它提供了一堆帮助函数,这样你就不需要自己解析和处理。设置这个库很奇怪,我不会在这展示它如何工作,但如果你想使用它,你可以去阅读这个教程。</p>
<p>多线程支持中最复杂的部分是调试器中线程状态的建模,特别是如果你希望支持不间断模式或当你计算中涉及不止一个 CPU 的某种异构调试。</p>
<strong>最后!</strong>
<p>呼!这个系列花了很长时间才写完,但是我在这个过程中学到了很多东西,我希望它是有帮助的。如果你有关于调试或本系列中的任何问题,请在 Twitter @TartanLlama或评论区联系我。如果你有想看到的其他任何调试主题,让我知道我或许会再发其他的文章。</p>

以上是深入探討Linux調試器的高階話題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:Linux就该这么学。如有侵權,請聯絡admin@php.cn刪除
Linux實際上有什麼好處?Linux實際上有什麼好處?Apr 12, 2025 am 12:20 AM

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

如何學習Linux基礎知識?如何學習Linux基礎知識?Apr 10, 2025 am 09:32 AM

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux最有用的是什麼?Linux最有用的是什麼?Apr 09, 2025 am 12:02 AM

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

Linux的缺點是什麼?Linux的缺點是什麼?Apr 08, 2025 am 12:01 AM

Linux的缺點包括用戶體驗、軟件兼容性、硬件支持和學習曲線。 1.用戶體驗不如Windows或macOS友好,依賴命令行界面。 2.軟件兼容性不如其他系統,缺乏許多商業軟件的原生版本。 3.硬件支持不如Windows全面,可能需要手動編譯驅動程序。 4.學習曲線較陡峭,掌握命令行操作需要時間和耐心。

Linux難以學習嗎?Linux難以學習嗎?Apr 07, 2025 am 12:01 AM

Linuxisnothardtolearn,butthedifficultydependsonyourbackgroundandgoals.ForthosewithOSexperience,especiallycommand-linefamiliarity,Linuxisaneasytransition.Beginnersmayfaceasteeperlearningcurvebutcanmanagewithproperresources.Linux'sopen-sourcenature,bas

Linux的5個基本組件是什麼?Linux的5個基本組件是什麼?Apr 06, 2025 am 12:05 AM

Linux的五個基本組件是:1.內核,管理硬件資源;2.系統庫,提供函數和服務;3.Shell,用戶與系統交互的接口;4.文件系統,存儲和組織數據;5.應用程序,利用系統資源實現功能。

Ubuntu Home Automation:使用開源工具建立智能的居住空間Ubuntu Home Automation:使用開源工具建立智能的居住空間Apr 05, 2025 am 09:19 AM

開啟智能家居新篇章:基於Ubuntu的開源家庭自動化系統 智能家居技術徹底改變了我們與生活空間的互動方式,為日常生活帶來了便利、安全和能源效率。從遠程控制燈光和電器,到監控安全攝像頭和自動化氣候控制,智能家居技術變得越來越普及。 然而,許多商業智能家居系統存在局限性:高昂的成本、隱私問題以及有限的兼容性。幸運的是,開源軟件解決方案結合Ubuntu的強大功能,提供了一種替代方案——允許用戶創建可定制、經濟高效且安全的智能家居生態系統。 本指南將探討如何使用Ubuntu和開源工具設置家庭自動化系統。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器