0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

GDB調(diào)試工具的原理

麥辣雞腿堡 ? 來(lái)源:CSDN博客 ? 作者:失了志的咸魚(yú) ? 2023-11-09 17:04 ? 次閱讀

一、GDB調(diào)試工具的原理

1.1 未執(zhí)行進(jìn)程調(diào)試

啟用gdb調(diào)試運(yùn)行g(shù)db ./test的時(shí)候,在操作系統(tǒng)里發(fā)生了很多復(fù)雜的事情,系統(tǒng)首先會(huì)啟動(dòng)gdb進(jìn)程,這個(gè)進(jìn)程會(huì)調(diào)用系統(tǒng)函數(shù)fork()來(lái)創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程做兩件事情:

?調(diào)用系統(tǒng)函數(shù)ptrace(PTRACE_TRACEME,[其他參數(shù)]);

?通過(guò)exec來(lái)加載、執(zhí)行可執(zhí)行程序test,那么test程序就在這個(gè)子進(jìn)程中開(kāi)始執(zhí)行了。

圖片

1.2 執(zhí)行中進(jìn)程調(diào)試

如果想對(duì)一個(gè)已經(jīng)執(zhí)行的進(jìn)程進(jìn)行調(diào)試,那么就要在gdb這個(gè)父進(jìn)程中調(diào)用ptrace(PTRACE_ATTACH,[其他參數(shù)]),此時(shí),gdb進(jìn)程會(huì)attach(綁定)到已經(jīng)執(zhí)行的進(jìn)程B,gdb把進(jìn)程B收養(yǎng)成為自己的子進(jìn)程,而子進(jìn)程B的行為等同于它進(jìn)行了一次 PTRACE_TRACEME操作。

此時(shí)gdb進(jìn)程會(huì)發(fā)送SIGSTO信號(hào)給子進(jìn)程B,子進(jìn)程B接收到SIGSTOP信號(hào)后,就會(huì)暫停執(zhí)行進(jìn)入TASK_STOPED狀態(tài),表示自己準(zhǔn)備好被調(diào)試了。

圖片

1.3 gdb系統(tǒng)調(diào)用原型介紹

#include < sys/ptrace.h >


long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);

ptrace系統(tǒng)函數(shù)是Linux內(nèi)核提供的一個(gè)用于進(jìn)程跟蹤的系統(tǒng)調(diào)用,通過(guò)它,一個(gè)進(jìn)程(gdb)可以讀寫(xiě)另外一個(gè)進(jìn)程(test)的指令空間、數(shù)據(jù)空間、堆棧和寄存器的值。

而且gdb進(jìn)程接管了test進(jìn)程的所有信號(hào),也就是說(shuō)系統(tǒng)向test進(jìn)程發(fā)送的所有信號(hào),都被gdb進(jìn)程接收到,這樣一來(lái),test進(jìn)程的執(zhí)行就被gdb控制了,從而達(dá)到調(diào)試的目的。

下面對(duì)各個(gè)參數(shù)進(jìn)行解釋?zhuān)?/p>

  1. ** enum __ptrace_request request:** 是一個(gè)枚舉類(lèi)型,用于指定要執(zhí)行的操作類(lèi)型。這個(gè)參數(shù)告訴** ptrace** 函數(shù)將要對(duì)進(jìn)程進(jìn)行何種跟蹤操作,例如讀取寄存器、寫(xiě)型,其定義了一系列跟蹤請(qǐng)求類(lèi)型的常量。例如,**PTRACE_ATTACH **表示附加到一個(gè)新進(jìn)程,PTRACE_GETREGS 表示獲取寄存器值。request的主要類(lèi)型如下:
    PTRACE_TRACEME:用于將當(dāng)前進(jìn)程標(biāo)記為被跟蹤的目標(biāo)。調(diào)用進(jìn)程使用這個(gè)類(lèi)型請(qǐng)求后,它的父進(jìn)程可以使用 PTRACE_ATTACH 來(lái)附加到它,對(duì)其進(jìn)行調(diào)試和跟蹤。
    PTRACE_ATTACH:用于將一個(gè)進(jìn)程附加到另一個(gè)進(jìn)程上進(jìn)行調(diào)試和跟蹤。調(diào)試器進(jìn)程可以使用這個(gè)類(lèi)型請(qǐng)求,通過(guò)指定目標(biāo)進(jìn)程ID來(lái)附加到目標(biāo)進(jìn)程。
    PTRACE_DETACH:用于從一個(gè)已經(jīng)被附加和調(diào)試的進(jìn)程上分離調(diào)試器。這個(gè)請(qǐng)求會(huì)停止對(duì)目標(biāo)進(jìn)程的跟蹤,并將其恢復(fù)為正常運(yùn)行狀態(tài)。
    PTRACE_PEEKDATA:用于從目標(biāo)進(jìn)程的內(nèi)存中讀取數(shù)據(jù)??梢允褂迷撜?qǐng)求來(lái)讀取目標(biāo)進(jìn)程的內(nèi)存值,例如寄存器、棧幀等。
    PTRACE_POKEDATA:用于向目標(biāo)進(jìn)程的內(nèi)存中寫(xiě)入數(shù)據(jù)??梢允褂迷撜?qǐng)求來(lái)修改目標(biāo)進(jìn)程的內(nèi)存值,例如修改寄存器、改變變量值等。
    PTRACE_GETREGS:用于獲取目標(biāo)進(jìn)程的寄存器值。通過(guò)這個(gè)請(qǐng)求,可以獲得目標(biāo)進(jìn)程的 CPU 寄存器的當(dāng)前值,用于調(diào)試和跟蹤。
    PTRACE_SETREGS:用于設(shè)置目標(biāo)進(jìn)程的寄存器值。通過(guò)這個(gè)請(qǐng)求,可以將特定的寄存器值設(shè)置為目標(biāo)進(jìn)程中的特定值。
    PTRACE_CONT:用于繼續(xù)執(zhí)行已附加的目標(biāo)進(jìn)程。調(diào)試器進(jìn)程可以使用這個(gè)請(qǐng)求來(lái)繼續(xù)目標(biāo)進(jìn)程的執(zhí)行,直到下一個(gè)斷點(diǎn)或者其他事件觸發(fā)。

2. pid_t pid: 是一個(gè)整數(shù)類(lèi)型,表示要操作的目標(biāo)進(jìn)程的進(jìn)程ID(PID)。pid指定了要對(duì)哪個(gè)進(jìn)程進(jìn)行跟蹤操作,可以是當(dāng)前進(jìn)程、正在運(yùn)行的其他進(jìn)程或子進(jìn)程等。

3. void addr: 是一個(gè)指針類(lèi)型,用于指定內(nèi)存地址,具體用途根據(jù)不同的request *參數(shù)而定。例如,對(duì)于一些讀寫(xiě)內(nèi)存的請(qǐng)求,addr指定了要讀取或?qū)懭氲膬?nèi)存地址。

4. void data: 是一個(gè)指針類(lèi)型,用于傳遞數(shù)據(jù),具體用途也根據(jù)不同的request *參數(shù)而定。對(duì)于一些讀寫(xiě)內(nèi)存或寄存器的請(qǐng)求,data指定了要讀取或?qū)懭氲臄?shù)據(jù)存儲(chǔ)位置。

ptrace函數(shù)返回一個(gè)long類(lèi)型值,表示操作的結(jié)果或錯(cuò)誤碼。通常情況下,返回值大于等于0表示成功,小于0表示發(fā)生錯(cuò)誤。

如果沒(méi)有g(shù)db調(diào)試,操作系統(tǒng)與目標(biāo)進(jìn)程之間是直接交互的;如果使用gdb來(lái)調(diào)試程序,那么操作系統(tǒng)發(fā)送給目標(biāo)進(jìn)程的信號(hào)就會(huì)被gdb截獲,gdb根據(jù)信號(hào)的屬性來(lái)決定:在繼續(xù)運(yùn)行目標(biāo)程序時(shí)是否把當(dāng)前截獲的信號(hào)轉(zhuǎn)交給目標(biāo)程序,如此一來(lái),目標(biāo)程序就在gdb發(fā)來(lái)的信號(hào)指揮下進(jìn)行相應(yīng)的動(dòng)作。

圖片

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

    關(guān)注

    31

    文章

    5425

    瀏覽量

    123542
  • 調(diào)試工具
    +關(guān)注

    關(guān)注

    1

    文章

    52

    瀏覽量

    12788
  • gdb
    gdb
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    13551
收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)如何建立開(kāi)發(fā)環(huán)境

    如版主所寫(xiě),Linux的開(kāi)發(fā)環(huán)境建立(1)編譯器arm-linux-gcc-3.4.1(2)Jflash-s3c2410:S3C2410芯片的JTAG工具(3)安裝gdb調(diào)試工具在裝載這些工具
    發(fā)表于 05-20 05:45

    VIM編輯器怎么實(shí)現(xiàn)對(duì)嵌入式軟件的調(diào)試功能?

    GNU免費(fèi)提供了一整套工具鏈,為嵌入式Linux程序的開(kāi)發(fā)和調(diào)試提供了完整的支持。其強(qiáng)大的gdb調(diào)試工具可以方便地對(duì)嵌入式平臺(tái)上的程序進(jìn)行跟蹤調(diào)試
    發(fā)表于 08-30 07:18

    VIM中怎么實(shí)現(xiàn)嵌入式軟件調(diào)試?

    GNU免費(fèi)提供了一整套工具鏈,為嵌入式Linux程序的開(kāi)發(fā)和調(diào)試提供了完整的支持。其強(qiáng)大的gdb調(diào)試工具可以方便地對(duì)嵌入式平臺(tái)上的程序進(jìn)行跟蹤調(diào)試
    發(fā)表于 03-06 07:50

    如何搭建嵌入式Linux的GDB調(diào)試環(huán)境

    linux 領(lǐng)域我們最常用的就是GDB 調(diào)試工具,通過(guò)GDB 來(lái)調(diào)試嵌入式C 程序。本章我們首先學(xué)習(xí)如何搭建嵌入式Linux的GDB
    發(fā)表于 11-05 06:03

    基于Windows的ARM GCC開(kāi)發(fā)環(huán) 境

    本文以 N32G430 系列 MCU 為例,介紹了在 Windows 環(huán)境下基于 vscode 編輯器、GCC 編譯工具鏈和 GDB 調(diào)試工具進(jìn)行搭建開(kāi)發(fā)環(huán)境,進(jìn)行代碼編譯、固件下載和代碼調(diào)試
    發(fā)表于 11-02 06:27

    N32G031系列GCC開(kāi)發(fā)環(huán)境應(yīng)用筆記分享

    本文以 N32N031 系列 MCU 為例,介紹了在 Windows 環(huán)境下基于 vscode 編輯器、GCC 編譯工具鏈和 GDB 調(diào)試工具進(jìn)行搭建開(kāi)發(fā)環(huán)境,進(jìn)行代碼編譯、固件下載和代碼調(diào)試
    發(fā)表于 11-02 07:20

    嵌入式Linux和嵌入式Linux開(kāi)發(fā)環(huán)境

    嵌入式Linux開(kāi)發(fā) 圖1是一個(gè)典型的嵌入式Linux開(kāi)發(fā)環(huán)境它包括主機(jī)工作站或者PC 支持GDB調(diào)試工具BDI2000 目標(biāo)板和網(wǎng)絡(luò).除了硬件環(huán)境外還需要軟件開(kāi)發(fā)環(huán)境有兩
    發(fā)表于 09-10 10:22 ?119次下載
    嵌入式Linux和嵌入式Linux開(kāi)發(fā)環(huán)境

    gdb調(diào)試工具指南 (很詳細(xì)的說(shuō)明)

    gdb調(diào)試工具指南,很詳細(xì)的說(shuō)明。
    發(fā)表于 03-28 09:52 ?45次下載

    如何在VIM中對(duì)嵌入式軟件進(jìn)行調(diào)試

    GNU免費(fèi)提供了一整套工具鏈,為嵌入式Linux程序的開(kāi)發(fā)和調(diào)試提供了完整的支持。其強(qiáng)大的gdb調(diào)試工具可以方便地對(duì)嵌入式平臺(tái)上的程序進(jìn)行跟蹤調(diào)試
    發(fā)表于 06-30 10:39 ?1273次閱讀
    如何在VIM中對(duì)嵌入式軟件進(jìn)行<b class='flag-5'>調(diào)試</b>

    初學(xué)GDB調(diào)試工具需要注意的事項(xiàng)

    GDB是一個(gè)由GNU開(kāi)源組織發(fā)布的、UNIX/LINUX操作系統(tǒng)下的、基于命令行的、功能強(qiáng)大的程序調(diào)試工具。相比于VS里面的圖形化調(diào)試工具,其功能更加強(qiáng)大。
    發(fā)表于 05-16 17:45 ?1262次閱讀
    初學(xué)<b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試工具</b>需要注意的事項(xiàng)

    STM32CubeIDE乃ST官方提供的免費(fèi)且功能強(qiáng)大的集成開(kāi)發(fā)工具

    STM32CubeIDE乃ST官方提供的免費(fèi)且功能強(qiáng)大的集成開(kāi)發(fā)工具,令STM32Cube生態(tài)系統(tǒng)更為豐富強(qiáng)勁。它基于Eclipse/CDT框架、GCC編譯工具鏈和GDB調(diào)試工具,并支
    的頭像 發(fā)表于 03-31 15:26 ?6245次閱讀
    STM32CubeIDE乃ST官方提供的免費(fèi)且功能強(qiáng)大的集成開(kāi)發(fā)<b class='flag-5'>工具</b>

    Linux嵌入式 gdb VSCode圖形化調(diào)試教程

    linux 領(lǐng)域我們最常用的就是GDB 調(diào)試工具,通過(guò)GDB 來(lái)調(diào)試嵌入式C 程序。本章我們首先學(xué)習(xí)如何搭建嵌入式Linux的GDB
    發(fā)表于 11-02 12:21 ?15次下載
    Linux嵌入式 <b class='flag-5'>gdb</b> VSCode圖形化<b class='flag-5'>調(diào)試</b>教程

    riscv-binutils-gdb RISC-V版gdb調(diào)試工具

    riscv-binutils-gdb.zip
    發(fā)表于 04-25 10:23 ?0次下載
    riscv-binutils-<b class='flag-5'>gdb</b> RISC-V版<b class='flag-5'>gdb</b><b class='flag-5'>調(diào)試工具</b>

    嵌入式Linux GDB是什么

    GDB 調(diào)試工具,通過(guò) GDB 來(lái)調(diào)試嵌入式 C 程序。 GDB 簡(jiǎn)介 gdb
    的頭像 發(fā)表于 07-27 16:29 ?954次閱讀
    嵌入式Linux <b class='flag-5'>GDB</b>是什么

    如何使用GDB調(diào)試工具

    在對(duì)應(yīng)程序目錄中使用下面的命令 gdb test 2、調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序進(jìn)程 調(diào)試已經(jīng)開(kāi)始運(yùn)行的程序進(jìn)程,首先先用top命令查看運(yùn)行的程序進(jìn)程的pid如下: 比如我要加載的程序
    的頭像 發(fā)表于 11-09 17:17 ?1178次閱讀
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試工具</b>

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品