0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分析主流硬件平臺和操作系統(tǒng)的軟件程序Debug原理

QuTG_CloudBrain ? 來源:移動Labs ? 2022-12-28 09:12 ? 次閱讀

Labs 導(dǎo)讀

Debug調(diào)試覆蓋了整個計算機(jī)領(lǐng)域,包括不限于數(shù)字電路、模擬仿真嵌入式硬件以及應(yīng)用軟件,是技術(shù)研發(fā)人員必須熟練掌握的重要技能,對于產(chǎn)品研發(fā)過程的代碼糾錯和產(chǎn)品質(zhì)量把控有重要影響,本文主要探討分析主流硬件平臺和操作系統(tǒng)的軟件程序Debug原理。

1

Bug和Debug

說起“Debug”,就不得不提及“Bug”這個程序猿和游戲玩家耳熟能詳?shù)脑~,它由美國格蕾絲·赫柏博士第一次提出,當(dāng)時運行研究數(shù)據(jù)的Harvard Mark II計算機(jī)突然不能正常工作,經(jīng)赫柏和團(tuán)隊的反復(fù)排查,發(fā)現(xiàn)是一只飛蛾飛入了電腦的內(nèi)部繼電器中造成短路而引起的故障。

修復(fù)故障后,赫柏在日記中詼諧地記錄下了這件事(圖1), “Bug”一詞(原意為“蟲子”)也逐漸被廣泛用于形容計算機(jī)程序中隱藏的錯誤,同時,受到從電腦中驅(qū)除飛蛾蟲子的啟發(fā),計算機(jī)術(shù)語“Debug”(調(diào)試排錯)開始使用。

87061be2-8609-11ed-bfe3-dac502259ad0.png

圖1

Debug調(diào)試覆蓋了整個計算機(jī)領(lǐng)域,包括不限于數(shù)字電路、模擬仿真、嵌入式軟硬件以及應(yīng)用軟件,是技術(shù)研發(fā)人員必須熟練掌握的重要技能,對于產(chǎn)品研發(fā)過程的代碼糾錯和產(chǎn)品質(zhì)量把控有重要影響,本文主要探討分析主流硬件平臺和操作系統(tǒng)的軟件程序Debug原理。

2

調(diào)試原理-斷點

對于如C、C++等編譯運行的可執(zhí)行程序,其Debug斷點調(diào)試需要硬件和操作系統(tǒng)的支持,主要依賴以下兩點:

(1) 硬件平臺和操作系統(tǒng)提供設(shè)置斷點的方法。

(2) 斷點觸發(fā)系統(tǒng)中斷通知到調(diào)試器的功能。

對于第一點斷點的實現(xiàn),從計算機(jī)體系角度看分為軟件斷點和硬件斷點。軟件斷點是指向指定的代碼位置插入專用的斷點指令實現(xiàn)(插樁)。而硬件斷點則是通過直接利用CPU核心的調(diào)試寄存器實現(xiàn),此場景主要針對不允許寫入操作的ROM只讀內(nèi)存和軟件斷點無法處理的情況,如中斷向量表被破壞等。

87250f3e-8609-11ed-bfe3-dac502259ad0.png

圖2

不同的硬件架構(gòu)對應(yīng)斷點實現(xiàn)指令也不相同,如果我們的硬件處理器基于X86系列,其軟件斷點工作原理是調(diào)試器將代碼對應(yīng)位置的原指令的首個字節(jié)保存起來,然后寫入一條INT3指令(圖2)。因為INT3指令的二進(jìn)制碼為11001100b(0xCC),僅有一個字節(jié),所以設(shè)置和取消斷點時也只需要保存和恢復(fù)一個字節(jié)。

當(dāng)CPU執(zhí)行到INT3指令時,將會觸操作系統(tǒng)軟中斷并停止運行當(dāng)前進(jìn)程,轉(zhuǎn)而執(zhí)行內(nèi)核定義好的中斷處理函數(shù)。X86的硬件斷點使用DR0-DR7調(diào)試地址寄存器,但是由于存儲斷點地址的寄存器數(shù)量有限(DR0-DR3),只能設(shè)置4個斷點?;?a target="_blank">ARM系列的斷點實現(xiàn)與X86平臺類似, 軟件斷點的工作原理是用HLT或BRK指令的操作碼進(jìn)行指令替換,硬件斷點使用內(nèi)置在core中的比較器,并在執(zhí)行到達(dá)指定地址時停止執(zhí)行并觸發(fā)相應(yīng)中斷,和X86一樣,由于只提供有限數(shù)量的硬件斷點單元也存在斷點設(shè)置數(shù)量限制。

對于第二點操作系統(tǒng)的中斷通知,以X86平臺為例,Windows平臺由操作系統(tǒng)軟中斷觸發(fā)的對應(yīng)函數(shù)為KiTrap03(),Linux平臺則是do_int3()函數(shù),這些函數(shù)均為操作系統(tǒng)內(nèi)核預(yù)先定義好的中斷處理例程。KiTrap03()會將斷點異常通過調(diào)試子系統(tǒng)以調(diào)試事件的形式分發(fā)給用戶模式的調(diào)試器,并等待調(diào)試器的回復(fù),只有調(diào)試器確認(rèn)該異常為“自己”設(shè)置的斷點后,才會允許掛起被調(diào)試進(jìn)程進(jìn)行交互性調(diào)試。do_int3()例程則是向被調(diào)試進(jìn)程發(fā)送一個SIGTRAP信號,當(dāng)進(jìn)程接收到SIGTRAP信號后,當(dāng)前進(jìn)程讓出CPU暫停運行。

3

調(diào)試原理-進(jìn)程交互模型

調(diào)試器和被調(diào)試進(jìn)程的如果都位于同一臺物理機(jī),即為跨進(jìn)程調(diào)試,反之為遠(yuǎn)程調(diào)試,遠(yuǎn)程調(diào)試是在跨進(jìn)程調(diào)試的基礎(chǔ)上增加了一層網(wǎng)絡(luò)協(xié)議交互。由于Windows和Linux的進(jìn)程描述模型存在一定差異,我們分別介紹這兩種平臺的調(diào)試器進(jìn)程交互原理。

3.1 Windows

WIN32內(nèi)核提供了一組系統(tǒng)Api用于支持調(diào)試器與被調(diào)試進(jìn)程交互,這里挑幾個重要函數(shù)進(jìn)行介紹。

874101b2-8609-11ed-bfe3-dac502259ad0.png

圖3

基于WIN32的調(diào)試器交互就是通過上述所示的調(diào)試函數(shù)和一系列調(diào)試事件[1]相結(jié)合實現(xiàn)。調(diào)試器啟動后首先通過CreateProcess函數(shù)創(chuàng)建待調(diào)試進(jìn)程,或者通過調(diào)用DebugActiveProcess函數(shù)捆綁到正在運行的進(jìn)程,在一系列準(zhǔn)備操作后就會進(jìn)入調(diào)試循環(huán)階段,調(diào)試器會阻塞調(diào)用WaitForDebugEvent函數(shù)來等待調(diào)試事件通知,當(dāng)有諸如異常事件或dll文件裝卸載事件通知到來時,此函數(shù)立即返回,返回的事件信息被封裝在DEBUG_EVENT結(jié)構(gòu)中,這個結(jié)構(gòu)包含事件的類型、相關(guān)進(jìn)程描述信息和文件句柄等。

此時調(diào)試器就進(jìn)入了命令交互階段,調(diào)試器將在自定義的事件處理函數(shù)ProcessEvent匹配事件并執(zhí)行對應(yīng)事件的回調(diào)代碼,如果是斷點觸發(fā)這類型操作,被調(diào)試目標(biāo)進(jìn)程的所有線程都會被操作系統(tǒng)掛起,此時調(diào)試器可以調(diào)用相關(guān)函數(shù)如GetThreadContext來獲取指定線程的上下文信息。調(diào)試器和目標(biāo)進(jìn)程地調(diào)試信息交互基于Windows進(jìn)程間同步機(jī)制,相關(guān)信息可參閱微軟相關(guān)開發(fā)文檔[2]。

874dedfa-8609-11ed-bfe3-dac502259ad0.png

圖4

3.2 Linux

相比Windows,Linux作為開源系統(tǒng)可以透過源碼更深入地窺探調(diào)試器原理,這里以GDB調(diào)試為例。

當(dāng)我們從shell終端對某個已編譯C程序文件進(jìn)行GDB命令調(diào)試時,系統(tǒng)首先會創(chuàng)建GDB進(jìn)程(調(diào)試器進(jìn)程),該進(jìn)程會fork出一個子進(jìn)程(調(diào)試目標(biāo)進(jìn)程),子進(jìn)程初始化后首先調(diào)用關(guān)鍵系統(tǒng)函數(shù)ptrace(PTRACE_TRACEME…),使自身進(jìn)入被追蹤模式;同時調(diào)用execv函數(shù)執(zhí)行待調(diào)試的C程序文件,此時會暫停當(dāng)前進(jìn)程的運行,并且發(fā)送一個SIGCHLD信號給父進(jìn)程,父進(jìn)程接收到SIGCHLD信號后就可以對被調(diào)試的進(jìn)程進(jìn)行調(diào)試。GDB也支持對已存在的進(jìn)程進(jìn)行調(diào)試,此時將由GDB進(jìn)程調(diào)用ptrace(PTRACE_ATTACH, pid, ...)對被調(diào)試進(jìn)程進(jìn)入被追蹤模式。

8754db1a-8609-11ed-bfe3-dac502259ad0.png

圖5

ptrace系統(tǒng)函數(shù)[3]是GDB交互調(diào)試的核心依賴函數(shù),該函數(shù)的第一個參數(shù)request確定要執(zhí)行的操作模式,這些操作模式定義了調(diào)試器控制讀寫被調(diào)試進(jìn)程的行為,具體支持的操作模式如下:

8772be64-8609-11ed-bfe3-dac502259ad0.png

圖6

借助ptrace函數(shù)的強(qiáng)大功能,GDB調(diào)試器進(jìn)程可以對調(diào)試目標(biāo)進(jìn)程的指令空間、數(shù)據(jù)空間、堆棧和寄存器的值進(jìn)行讀寫,如堆棧打印、變量展示修改等。GDB同時會截獲內(nèi)核通知到被調(diào)試進(jìn)程的幾乎所有信號,通過對這些信號的攔截和判定,調(diào)試器進(jìn)程就可以對程序進(jìn)行斷點匹配和單步調(diào)試等操作[4]。

4

調(diào)試器的未來發(fā)展

Windows平臺的Windbg、Linux的GDB調(diào)試器都是功能全面、具有復(fù)雜邏輯實現(xiàn)的軟件工具,這些debugger調(diào)試器因為根植于不同硬件平臺和操作系統(tǒng),存在著底層功能實現(xiàn)和交互模型的顯著差異,很明顯不適合跨平臺發(fā)展,而隨著Java、Js、python等解釋型語言的興起和云平臺的發(fā)展,虛擬機(jī)調(diào)試體系(JDPA、v8 debug protocol)被提出和廣泛應(yīng)用,這種百花齊放的局面讓IDE廠家面臨著一個非常棘手的問題——調(diào)試器交互規(guī)范不統(tǒng)一帶來的巨大開發(fā)難度,微軟針對此問題率先提出了DAP(Debug Adapter Protocol)協(xié)議,讓各廠家IDE(主要是還是服務(wù)自家的VsCode)通過相同的協(xié)議基于適配器模式與不同語言的debugger通信,力圖屏蔽軟硬件底層的差異性,降低IDE調(diào)試器的開發(fā)難度。DAP協(xié)議憑借著專業(yè)性和普適性得到了業(yè)界的一定認(rèn)可,不過Eclipse和IDEA等JAVA編輯器仍然是直接適配JDPA調(diào)試體系的,畢竟軟件行業(yè)統(tǒng)一規(guī)范的背后仍然是各家科技公司行業(yè)話語權(quán)的爭奪。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 繼電器
    +關(guān)注

    關(guān)注

    132

    文章

    5301

    瀏覽量

    148143
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    549

    瀏覽量

    85566
  • 比較器
    +關(guān)注

    關(guān)注

    14

    文章

    1623

    瀏覽量

    106996
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    297

    瀏覽量

    23631

原文標(biāo)題:應(yīng)用程序調(diào)試原理淺析

文章出處:【微信號:CloudBrain-TT,微信公眾號:云腦智庫】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    什么是操作系統(tǒng)

    什么是操作系統(tǒng)  操作系統(tǒng)是一個大型的軟件系統(tǒng),其功能復(fù)雜,體系龐大。從不同的角度看的結(jié)果也不同,正是“橫看成嶺側(cè)成峰”,下面我們通過最典型的兩個角度來
    發(fā)表于 09-13 10:10

    嵌入式操作系統(tǒng)的通用硬件抽象層設(shè)計

    的計算機(jī)系統(tǒng)。它自底向上包括3個主要部分:硬件環(huán)境、嵌入式操作系統(tǒng)和嵌入式應(yīng)用程序。硬件環(huán)境是整個嵌入式
    發(fā)表于 12-07 10:30

    主流嵌入式操作系統(tǒng)有哪些?

    ,是由操作系統(tǒng)Linux、中間件以及核心應(yīng)用程序組成的軟件棧。通過android SDK提供的API以及相應(yīng)的開發(fā)工具,程序員可以很方便的開發(fā)android
    發(fā)表于 07-10 19:02

    Linux操作系統(tǒng)怎么移植到ARM平臺?

    目前,在嵌入式系統(tǒng)里基于ARM微核的嵌入式處理器以其功耗低,功能強(qiáng)大的優(yōu)點已經(jīng)成為市場的主流。與此同時,在網(wǎng)絡(luò)上發(fā)展起來的Linux操作系統(tǒng),以其功能強(qiáng)大,開放源代碼,支持硬件種類眾多
    發(fā)表于 08-19 06:39

    怎么設(shè)計開源嵌入式操作系統(tǒng)學(xué)習(xí)平臺

    近年來,隨著嵌入式系統(tǒng)的飛速發(fā)展和廣泛應(yīng)用,裸機(jī)模式已無法適應(yīng)日益復(fù)雜的系統(tǒng)開發(fā),嵌入式操作系統(tǒng)已經(jīng)成為開發(fā)中不可或缺的核心軟件,對其進(jìn)行學(xué)習(xí)研究的需求也日益突出。 嵌入式
    發(fā)表于 08-28 07:22

    主流物聯(lián)網(wǎng)操作系統(tǒng)的比較

    、實時性和安全的傳感、連接、云端管理服務(wù)軟件平臺。目前物聯(lián)網(wǎng)操作系統(tǒng)大致可以分為兩類:一類是為物聯(lián)網(wǎng)而生的 OS,即針對物聯(lián)網(wǎng)而做的 OS ,之前并沒有,代表產(chǎn)品有 ARM 公司的 Mbed OS、慶科
    發(fā)表于 09-17 09:05

    ARM操作系統(tǒng)應(yīng)用程序

    ZYNQ將CPU和FPGA集成到了一起 開發(fā)人員需要具備技能: 1.ARM操作系統(tǒng)應(yīng)用程序 2.設(shè)備驅(qū)動程序 3.FPGA硬件邏輯設(shè)計 需要了解Linux
    發(fā)表于 07-22 08:55

    如何使嵌入式操作系統(tǒng)在不同的硬件平臺上有效地運行

    嵌入式系統(tǒng)硬件環(huán)境、嵌入式操作系統(tǒng)和應(yīng)用程序組成,硬件環(huán)境是操作系統(tǒng)和應(yīng)用
    發(fā)表于 11-05 08:06

    為什么要用操作系統(tǒng)

    何謂操作系統(tǒng)1.什么是操作系統(tǒng)?操作系統(tǒng)是管理和控制計算機(jī)硬件軟件資源的計算機(jī)程序,是直接運行
    發(fā)表于 12-14 07:56

    什么是計算機(jī)操作系統(tǒng)

    什么是計算機(jī)操作系統(tǒng)?操作系統(tǒng)是一種為應(yīng)用程序提供服務(wù)的系統(tǒng)軟件,是一個完整的計算機(jī)系統(tǒng)的有機(jī)組成部分。從層次上來看,
    發(fā)表于 12-14 06:50

    硬件看門狗在操作系統(tǒng)下是怎么用的?

    關(guān)于軟件看門狗:在裸機(jī)程序軟件看門狗,大家都會在必要的地方喂狗保證看門狗有效;但在微操作系統(tǒng)下,程序的流向都是在
    發(fā)表于 09-07 16:49

    基于eCos操作系統(tǒng)的FLASH驅(qū)動程序分析與移植

    基于eCos操作系統(tǒng)的FLASH驅(qū)動程序分析與移植 0 引 言   嵌入式系統(tǒng)需要支持的外部設(shè)備種類繁多,如何構(gòu)造運行良好的嵌入式設(shè)備的驅(qū)動
    發(fā)表于 12-28 10:50 ?1243次閱讀
    基于eCos<b class='flag-5'>操作系統(tǒng)</b>的FLASH驅(qū)動<b class='flag-5'>程序</b><b class='flag-5'>分析</b>與移植

    Windows應(yīng)用程序操作系統(tǒng),計算機(jī)硬件之間的相互關(guān)系

    前面說過操作系統(tǒng)能很好的去操作底層硬件,但是不知道什么時候去操作操作到了什么程度,這些都是由應(yīng)用程序
    的頭像 發(fā)表于 06-29 08:49 ?1.2w次閱讀

    汽車操作系統(tǒng)的教程信息及看法

    vehicles. 操作系統(tǒng) (OS) 是管理基于計算機(jī)的系統(tǒng)的所有硬件軟件所必需的,它是汽車行業(yè)的關(guān)鍵軟件
    的頭像 發(fā)表于 07-14 08:17 ?935次閱讀
    汽車<b class='flag-5'>操作系統(tǒng)</b>的教程信息及看法

    深度解析全球操作系統(tǒng)格局

    操作系統(tǒng)是負(fù)責(zé)協(xié)調(diào)、管理和控制計算機(jī)硬件軟件資源的程序,是整個計算機(jī)的核心系統(tǒng)軟件。 按照操作系統(tǒng)
    的頭像 發(fā)表于 01-18 15:00 ?871次閱讀
    深度解析全球<b class='flag-5'>操作系統(tǒng)</b>格局