在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

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

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

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

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

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

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

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

圖片

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

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

此時gdb進(jìn)程會發(fā)送SIGSTO信號給子進(jìn)程B,子進(jìn)程B接收到SIGSTOP信號后,就會暫停執(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)核提供的一個用于進(jìn)程跟蹤的系統(tǒng)調(diào)用,通過它,一個進(jìn)程(gdb)可以讀寫另外一個進(jìn)程(test)的指令空間、數(shù)據(jù)空間、堆棧和寄存器的值。

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

下面對各個參數(shù)進(jìn)行解釋:

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

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

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

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

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

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

圖片

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

    關(guān)注

    31

    文章

    5425

    瀏覽量

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

    關(guān)注

    1

    文章

    52

    瀏覽量

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

    關(guān)注

    0

    文章

    60

    瀏覽量

    13556
收藏 人收藏

    評論

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

    請問如何建立開發(fā)環(huán)境

    如版主所寫,Linux的開發(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編輯器怎么實現(xiàn)對嵌入式軟件的調(diào)試功能?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    linux 領(lǐng)域我們最常用的就是GDB 調(diào)試工具,通過GDB調(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)試工具,通過 GDB調(diào)試嵌入式 C 程序。 GDB 簡介 gdb
    的頭像 發(fā)表于 07-27 16:29 ?956次閱讀
    嵌入式Linux <b class='flag-5'>GDB</b>是什么

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

    在對應(yīng)程序目錄中使用下面的命令 gdb test 2、調(diào)試已經(jīng)開始運行的程序進(jìn)程 調(diào)試已經(jīng)開始運行的程序進(jìn)程,首先先用top命令查看運行的程序進(jìn)程的pid如下: 比如我要加載的程序
    的頭像 發(fā)表于 11-09 17:17 ?1185次閱讀
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>調(diào)試工具</b>
    主站蜘蛛池模板: 天天做天天爱夜夜想毛片 | 免费看美女毛片 | 夜夜狠狠 | 成年女人色费视频免费 | 国产伦精品一区二区三区免费 | 成人a毛片在线看免费全部播放 | 奇米欧美成人综合影院 | 午夜影院网站 | 日韩免费视频一区二区 | 欧美日本不卡 | 免费特黄 | 禁漫羞羞a漫入口 | 欧美一区二区三区激情啪啪 | 在线免费视频网站 | 精品视频一区二区三区 | 亚洲午夜久久久精品影院 | 欧美黄色一级视频 | 亚洲第一看片 | 另类五月 | 女人张开腿 让男人桶视频 女人张开腿等男人桶免费视频 | 日日噜噜爽爽狠狠视频 | 在线观看视频免费入口 | 成人a级特黄毛片 | 在线观看黄色的网站 | 亚洲高清日韩精品第一区 | 永久免费在线观看视频 | 嘿嘿嘿视频在线观看网站 | 噜噜噜天天躁狠狠躁夜夜精品 | 一级特黄视频 | 福利午夜 | 四虎影视精品 | 亚洲va中文va欧美va爽爽 | 国产亚洲视频在线播放大全 | 色精品一区二区三区 | 久操综合| 四虎免费影院4hu永久免费 | avtt亚洲一区中文字幕 | 老师在办公室被躁得舒服小说 | 男人午夜禁片在线观看 | 亚洲 欧洲 日产 韩国在线 | 国产精品超清大白屁股 |