<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GDB調試工具的原理

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

一、GDB調試工具的原理

1.1 未執行進程調試

啟用gdb調試運行gdb ./test的時候,在操作系統里發生了很多復雜的事情,系統首先會啟動gdb進程,這個進程會調用系統函數fork()來創建一個子進程,這個子進程做兩件事情:

?調用系統函數ptrace(PTRACE_TRACEME,[其他參數]);

?通過exec來加載、執行可執行程序test,那么test程序就在這個子進程中開始執行了。

圖片

1.2 執行中進程調試

如果想對一個已經執行的進程進行調試,那么就要在gdb這個父進程中調用ptrace(PTRACE_ATTACH,[其他參數]),此時,gdb進程會attach(綁定)到已經執行的進程B,gdb把進程B收養成為自己的子進程,而子進程B的行為等同于它進行了一次 PTRACE_TRACEME操作。

此時gdb進程會發送SIGSTO信號給子進程B,子進程B接收到SIGSTOP信號后,就會暫停執行進入TASK_STOPED狀態,表示自己準備好被調試了。

圖片

1.3 gdb系統調用原型介紹

#include < sys/ptrace.h >


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

ptrace系統函數是Linux內核提供的一個用于進程跟蹤的系統調用,通過它,一個進程(gdb)可以讀寫另外一個進程(test)的指令空間、數據空間、堆棧和寄存器的值。

而且gdb進程接管了test進程的所有信號,也就是說系統向test進程發送的所有信號,都被gdb進程接收到,這樣一來,test進程的執行就被gdb控制了,從而達到調試的目的。

下面對各個參數進行解釋:

  1. ** enum __ptrace_request request:** 是一個枚舉類型,用于指定要執行的操作類型。這個參數告訴** ptrace** 函數將要對進程進行何種跟蹤操作,例如讀取寄存器、寫型,其定義了一系列跟蹤請求類型的常量。例如,**PTRACE_ATTACH **表示附加到一個新進程,PTRACE_GETREGS 表示獲取寄存器值。request的主要類型如下:
    PTRACE_TRACEME:用于將當前進程標記為被跟蹤的目標。調用進程使用這個類型請求后,它的父進程可以使用 PTRACE_ATTACH 來附加到它,對其進行調試和跟蹤。
    PTRACE_ATTACH:用于將一個進程附加到另一個進程上進行調試和跟蹤。調試器進程可以使用這個類型請求,通過指定目標進程ID來附加到目標進程。
    PTRACE_DETACH:用于從一個已經被附加和調試的進程上分離調試器。這個請求會停止對目標進程的跟蹤,并將其恢復為正常運行狀態。
    PTRACE_PEEKDATA:用于從目標進程的內存中讀取數據??梢允褂迷撜埱髞碜x取目標進程的內存值,例如寄存器、棧幀等。
    PTRACE_POKEDATA:用于向目標進程的內存中寫入數據??梢允褂迷撜埱髞硇薷哪繕诉M程的內存值,例如修改寄存器、改變變量值等。
    PTRACE_GETREGS:用于獲取目標進程的寄存器值。通過這個請求,可以獲得目標進程的 CPU 寄存器的當前值,用于調試和跟蹤。
    PTRACE_SETREGS:用于設置目標進程的寄存器值。通過這個請求,可以將特定的寄存器值設置為目標進程中的特定值。
    PTRACE_CONT:用于繼續執行已附加的目標進程。調試器進程可以使用這個請求來繼續目標進程的執行,直到下一個斷點或者其他事件觸發。

2. pid_t pid: 是一個整數類型,表示要操作的目標進程的進程ID(PID)。pid指定了要對哪個進程進行跟蹤操作,可以是當前進程、正在運行的其他進程或子進程等。

3. void addr: 是一個指針類型,用于指定內存地址,具體用途根據不同的request *參數而定。例如,對于一些讀寫內存的請求,addr指定了要讀取或寫入的內存地址。

4. void data: 是一個指針類型,用于傳遞數據,具體用途也根據不同的request *參數而定。對于一些讀寫內存或寄存器的請求,data指定了要讀取或寫入的數據存儲位置。

ptrace函數返回一個long類型值,表示操作的結果或錯誤碼。通常情況下,返回值大于等于0表示成功,小于0表示發生錯誤。

如果沒有gdb調試,操作系統與目標進程之間是直接交互的;如果使用gdb來調試程序,那么操作系統發送給目標進程的信號就會被gdb截獲,gdb根據信號的屬性來決定:在繼續運行目標程序時是否把當前截獲的信號轉交給目標程序,如此一來,目標程序就在gdb發來的信號指揮下進行相應的動作。

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    30

    文章

    5141

    瀏覽量

    118055
  • 調試工具
    +關注

    關注

    1

    文章

    42

    瀏覽量

    12565
  • gdb
    gdb
    +關注

    關注

    0

    文章

    60

    瀏覽量

    13177
收藏 人收藏

    評論

    相關推薦

    請問如何建立開發環境

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

    VIM編輯器怎么實現對嵌入式軟件的調試功能?

    GNU免費提供了一整套工具鏈,為嵌入式Linux程序的開發和調試提供了完整的支持。其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試
    發表于 08-30 07:18

    VIM中怎么實現嵌入式軟件調試?

    GNU免費提供了一整套工具鏈,為嵌入式Linux程序的開發和調試提供了完整的支持。其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試
    發表于 03-06 07:50

    如何搭建嵌入式Linux的GDB調試環境

    linux 領域我們最常用的就是GDB 調試工具,通過GDB調試嵌入式C 程序。本章我們首先學習如何搭建嵌入式Linux的GDB
    發表于 11-05 06:03

    基于Windows的ARM GCC開發環 境

    本文以 N32G430 系列 MCU 為例,介紹了在 Windows 環境下基于 vscode 編輯器、GCC 編譯工具鏈和 GDB 調試工具進行搭建開發環境,進行代碼編譯、固件下載和代碼調試
    發表于 11-02 06:27

    N32G031系列GCC開發環境應用筆記分享

    本文以 N32N031 系列 MCU 為例,介紹了在 Windows 環境下基于 vscode 編輯器、GCC 編譯工具鏈和 GDB 調試工具進行搭建開發環境,進行代碼編譯、固件下載和代碼調試
    發表于 11-02 07:20

    嵌入式Linux和嵌入式Linux開發環境

    嵌入式Linux開發 圖1是一個典型的嵌入式Linux開發環境它包括主機工作站或者PC 支持GDB調試工具BDI2000 目標板和網絡.除了硬件環境外還需要軟件開發環境有兩
    發表于 09-10 10:22 ?117次下載
    嵌入式Linux和嵌入式Linux開發環境

    gdb調試工具指南 (很詳細的說明)

    gdb調試工具指南,很詳細的說明。
    發表于 03-28 09:52 ?45次下載

    如何在VIM中對嵌入式軟件進行調試

    GNU免費提供了一整套工具鏈,為嵌入式Linux程序的開發和調試提供了完整的支持。其強大的gdb調試工具可以方便地對嵌入式平臺上的程序進行跟蹤調試
    發表于 06-30 10:39 ?1061次閱讀
    如何在VIM中對嵌入式軟件進行<b class='flag-5'>調試</b>

    初學GDB調試工具需要注意的事項

    GDB是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基于命令行的、功能強大的程序調試工具。相比于VS里面的圖形化調試工具,其功能更加強大。
    發表于 05-16 17:45 ?988次閱讀
    初學<b class='flag-5'>GDB</b><b class='flag-5'>調試工具</b>需要注意的事項

    STM32CubeIDE乃ST官方提供的免費且功能強大的集成開發工具

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

    Linux嵌入式 gdb VSCode圖形化調試教程

    linux 領域我們最常用的就是GDB 調試工具,通過GDB調試嵌入式C 程序。本章我們首先學習如何搭建嵌入式Linux的GDB
    發表于 11-02 12:21 ?15次下載
    Linux嵌入式 <b class='flag-5'>gdb</b> VSCode圖形化<b class='flag-5'>調試</b>教程

    riscv-binutils-gdb RISC-V版gdb調試工具

    riscv-binutils-gdb.zip
    發表于 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'>調試工具</b>

    嵌入式Linux GDB是什么

    GDB 調試工具,通過 GDB調試嵌入式 C 程序。 GDB 簡介 gdb
    的頭像 發表于 07-27 16:29 ?475次閱讀
    嵌入式Linux <b class='flag-5'>GDB</b>是什么

    如何使用GDB調試工具

    在對應程序目錄中使用下面的命令 gdb test 2、調試已經開始運行的程序進程 調試已經開始運行的程序進程,首先先用top命令查看運行的程序進程的pid如下: 比如我要加載的程序
    的頭像 發表于 11-09 17:17 ?393次閱讀
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>調試工具</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>