国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

開發一個Linux調試器(十):高級主題

系統 Linux
我們終于來到這個系列的最后一篇文章!這一次,我將對調試中的一些更高級的概念進行高層的概述:遠程調試、共享庫支持、表達式計算和多線程支持。這些想法實現起來比較復雜,所以我不會詳細說明如何做,但是如果你有問題的話,我很樂意回答有關這些概念的問題。

[[206160]]

我們終于來到這個系列的最后一篇文章!這一次,我將對調試中的一些更高級的概念進行高層的概述:遠程調試、共享庫支持、表達式計算和多線程支持。這些想法實現起來比較復雜,所以我不會詳細說明如何做,但是如果你有問題的話,我很樂意回答有關這些概念的問題。

系列索引

  1. 準備環境
  2. 斷點
  3. 寄存器和內存
  4. ELF 和 DWARF
  5. 源碼和信號
  6. 源碼級逐步執行
  7. 源碼級斷點
  8. 堆棧展開
  9. 處理變量
  10. 高級話題

遠程調試

遠程調試對于嵌入式系統或對不同環境進行調試非常有用。它還在高級調試器操作和與操作系統和硬件的交互之間設置了一個很好的分界線。事實上,像 GDB 和 LLDB 這樣的調試器即使在調試本地程序時也可以作為遠程調試器運行。一般架構是這樣的:

 

debugarch

調試器是我們通過命令行交互的組件。也許如果你使用的是 IDE,那么在其上有另一個層可以通過機器接口與調試器進行通信。在目標機器上(可能與本機一樣)有一個調試存根debug stub ,理論上它是一個非常小的操作系統調試庫的包裝程序,它執行所有的低級調試任務,如在地址上設置斷點。我說“在理論上”,因為如今調試存根變得越來越大。例如,我機器上的 LLDB 調試存根大小是 7.6MB。調試存根通過使用一些特定于操作系統的功能(在我們的例子中是 ptrace)和被調試進程以及通過遠程協議的調試器通信。

最常見的遠程調試協議是 GDB 遠程協議。這是一種基于文本的數據包格式,用于在調試器和調試存根之間傳遞命令和信息。我不會詳細介紹它,但你可以在這里進一步閱讀。如果你啟動 LLDB 并執行命令 log enable gdb-remote packets,那么你將獲得通過遠程協議發送的所有數據包的跟蹤信息。在 GDB 上,你可以用 set remotelogfile <file> 做同樣的事情。

作為一個簡單的例子,這是設置斷點的數據包:

  1. $Z0,400570,1#43 

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

GDB 遠程協議非常易于擴展自定義數據包,這對于實現平臺或語言特定的功能非常有用。

共享庫和動態加載支持

調試器需要知道被調試程序加載了哪些共享庫,以便它可以設置斷點、獲取源代碼級別的信息和符號等。除查找被動態鏈接的庫之外,調試器還必須跟蹤在運行時通過 dlopen 加載的庫。為了達到這個目的,動態鏈接器維護一個 交匯結構體。該結構體維護共享庫描述符的鏈表,以及一個指向每當更新鏈表時調用的函數的指針。這個結構存儲在 ELF 文件的 .dynamic 段中,在程序執行之前被初始化。

一個簡單的跟蹤算法:

  • 追蹤程序在 ELF 頭中查找程序的入口(或者可以使用存儲在 /proc/<pid>/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 選項:

  1. ptrace(PTRACE_SETOPTIONS, m_pid, nullptr, PTRACE_O_TRACECLONE); 

現在當 clone 被調用時,該進程將收到我們的老朋友 SIGTRAP 信號。對于本系列中的調試器,你可以將一個例子添加到 handle_sigtrap 來處理新線程的創建:

  1. case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): 
  2.     //get the new thread ID 
  3.     unsigned long event_message = 0; 
  4.     ptrace(PTRACE_GETEVENTMSG, pid, nullptr, message); 
  5.     //handle creation 
  6.     //... 

一旦收到了,你可以看看 /proc/<pid>/task/ 并查看內存映射之類來獲得所需的所有信息。

GDB 使用 libthread_db,它提供了一堆幫助函數,這樣你就不需要自己解析和處理。設置這個庫很奇怪,我不會在這展示它如何工作,但如果你想使用它,你可以去閱讀這個教程。

多線程支持中最復雜的部分是調試器中線程狀態的建模,特別是如果你希望支持不間斷模式或當你計算中涉及不止一個 CPU 的某種異構調試。

最后!

呼!這個系列花了很長時間才寫完,但是我在這個過程中學到了很多東西,我希望它是有幫助的。如果你有關于調試或本系列中的任何問題,請在 Twitter @TartanLlama或評論區聯系我。如果你有想看到的其他任何調試主題,讓我知道我或許會再發其他的文章。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2017-06-28 14:21:22

Linux調試器斷點

2017-06-22 10:44:55

Linux調試器準備環境

2017-10-09 10:26:01

Linux調試器堆棧展開

2017-10-09 10:56:49

Linux調試器處理變量

2017-08-28 14:40:57

Linux調試器源碼和信號

2017-07-25 10:30:32

Linux調試器Elves和dwarv

2017-09-25 08:04:31

Linux調試器源碼級斷點

2017-07-05 14:37:07

Linux調試器寄存器和內存

2017-08-28 15:29:19

Linux調試器源碼級逐步執行

2017-04-19 21:35:38

Linux調試器工作原理

2011-08-25 16:34:27

Lua調試器

2010-03-01 11:06:52

Python 調試器

2020-03-16 10:05:13

EmacsGUDLinux

2009-12-14 10:57:34

Ruby調試器

2011-08-31 16:51:12

Lua調試器

2019-12-06 14:30:41

GNU調試器GDB修復代碼

2023-02-28 11:39:55

CMake腳本項目

2024-03-13 08:00:00

Linux調試器應用程序

2009-06-23 11:05:05

Mircosoft C

2011-08-31 16:47:07

Lua調試器
點贊
收藏

51CTO技術棧公眾號

国产69精品久久久久9999| 国产精品区一区二区三在线播放 | 波多野结衣久草一区| **精品中文字幕一区二区三区| 在线免费一区三区| 美女av电影| 91论坛在线播放| 蜜臀精品一区二区| 国产一区 二区 三区一级| 少妇特黄a一区二区三区| 天天综合亚洲| 国产美女精彩久久| 国产一区二区三区四区大秀| 清纯唯美亚洲综合| 日韩成人av在线资源| 久久影视免费观看| www.91精品| 亚州欧美日韩中文视频| 精品一区精品二区| 最新国产在线拍揄自揄视频| 欧美日韩国产大片| 日本在线视频观看| 日韩精品一区二区三区蜜臀| 99thz桃花论族在线播放| 日韩高清不卡av| 91精品影视| 欧美国产第二页| 久久91成人| 成人区精品一区二区| 亚洲一区自拍| 99久re热视频精品98| 26uuu国产日韩综合| 午夜爽爽爽男女免费观看影院| 一区二区在线观看免费视频播放| 500福利第一精品导航| 在线观看一区日韩| 在线观看免费视频你懂的| 日韩成人av网址| 电影一区二区三区久久免费观看| 久久久久中文字幕| 亚洲国产一成人久久精品| 美国av一区二区三区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 91亚洲精品久久久蜜桃网站| 欧美三级午夜理伦三级| 国产精品色哟哟| 久久免费看视频| 精品国产露脸精彩对白| 日本精品一区二区三区在线观看视频| 国产精品大陆在线观看| 亚洲一区二区网站| 免费观看国产精品视频| 亚洲精品国产a久久久久久| av电影在线观看一区二区三区| 日韩久久精品电影| 国产在线播放精品| 快播亚洲色图| 99久久精品一区| 在线免费观看你懂的| 亚洲国产精彩中文乱码av| 99热这里只有精品首页 | 久久伊人资源站| 麻豆精品精品国产自在97香蕉| 黄网站app在线观看下载视频大全官网 | 人人精品久久| 欧美精品福利视频| 亚洲国产专区| 日韩成人手机在线| 一区二区三区日韩欧美| 四虎av在线| 欧日韩在线观看| 日韩av网站在线观看| 成人亚洲在线观看| 日韩片之四级片| 一区二区美女| 18视频在线观看娇喘| 欧美丝袜第一区| 精品视频在线观看网站| 国模一区二区三区私拍视频| 成人影院在线看| 欧美乱大交做爰xxxⅹ性3| 日韩一级精品| 国产成人精品一区| 久久国产精品第一页| 国产日本视频| 一区二区在线视频| 欧美日韩精选| 成年免费网站| 日韩中文第一页| 日产国产欧美视频一区精品| 中文在线www| 欧美激情在线有限公司| 国产一区中文字幕| 91网在线播放| 国产欧美精品va在线观看| 91蜜桃在线观看| 俺来也官网欧美久久精品| 91在线观看免费网站| 国产日韩欧美一区二区三区乱码 | 性欧美疯狂xxxxbbbb| 四虎国产精品免费久久| 午夜精品短视频| 在线中文字幕一区二区| 精品大片一区二区| 天天色综合社区| 亚洲视频网站在线观看| 久久一区精品| 成在在线免费视频| 国产精品久久中文| 国产精品福利一区二区三区| 久久av影院| 日韩欧美不卡在线| 激情不卡一区二区三区视频在线| 日本成在线观看| 最好看的2019年中文视频| 希岛爱理一区二区三区| 少妇激情一区二区三区| 久久中文资源| 不卡av免费观看| 99re亚洲国产精品| 精品视频在线播放一区二区三区 | 一区二区三区不卡视频| 国产成人免费| 宅男一区二区三区| 欧美不卡一区二区三区| 日韩一级欧洲| av毛片在线免费| 欧美日韩综合精品| 媚黑女一区二区| www红色一片_亚洲成a人片在线观看_| 成人丁香基地| 伊人网在线视频| 日韩精品一二| 欧美性受黑人性爽| 亚洲欧美一区二区三区在线| 中文字幕日韩av资源站| av在线天天| 亚洲人妖在线| 国产精品视频色| 精品女厕一区二区三区| 中文字幕一区三区| 亚洲人成电影网站色mp4| 激情五月播播久久久精品| 蜜桃精品在线观看| 91亚洲精品久久久蜜桃网站| 欧美一区二区三区爱爱| 色老头一区二区三区| 欧美视频完全免费看| 26uuu亚洲综合色| 99亚洲一区二区| 蜜臀国产一区| 成人免费一区二区三区视频网站| 欧美成人精品在线播放| 国产精品专区一| 国产亚洲精品久久飘花| 国内视频一区二区| 奇米影视亚洲狠狠色| 欧美放荡办公室videos4k| 日本成人免费在线| 欧美日韩免费高清一区色橹橹| 中文字幕乱码日本亚洲一区二区| 国产欧美精品区一区二区三区 | 午夜亚洲福利| 首页国产欧美久久| 国产日韩精品一区二区三区| 亚洲国产精品精华液网站 | 欧美sm精品调教视频| 精品伦理一区二区| 高潮毛片在线观看| 成人免费影院| 国产一区二区区别| 午夜视频精品| 1024成人网| 欧美性欧美巨大黑白大战| 欧美三级蜜桃2在线观看| 久久久久久久久久久久久国产精品 | 成人妇女免费播放久久久| 亚洲欧美色婷婷| 日本天堂一区| 福利影院在线看| 国产精品高清一区二区| 国产精品视频久久一区| 国产日本欧美一区二区| 在线日韩欧美视频| 日本一区二区三区四区高清视频 | 99一区二区| 欧美视频不卡中文| 久久精品成人| 懂色aⅴ精品一区二区三区| 日本大胆人体视频| 国产精品久久久久av免费| 亚洲成人激情在线| 亚洲精品一二区| 国产网站一区二区| 奶水喷射视频一区| 久久久久亚洲| 国产精品一区二区婷婷| 日本不卡1区2区3区| 六月丁香婷婷激情| av免费在线免费观看|