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:用于从目标进程的内存中读取数据。可以使用该请求来读取目标进程的内存值,例如寄存器、栈帧等。
    PTRACE_POKEDATA:用于向目标进程的内存中写入数据。可以使用该请求来修改目标进程的内存值,例如修改寄存器、改变变量值等。
    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发来的信号指挥下进行相应的动作。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120224
  • 调试工具
    +关注

    关注

    1

    文章

    49

    浏览量

    12633
  • gdb
    gdb
    +关注

    关注

    0

    文章

    60

    浏览量

    13295
收藏 人收藏

    评论

    相关推荐

    请问如何建立开发环境

    如版主所写,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 119次下载
    嵌入式Linux和嵌入式Linux开发环境

    gdb调试工具指南 (很详细的说明)

    gdb调试工具指南,很详细的说明。
    发表于 03-28 09:52 45次下载

    如何在VIM中对嵌入式软件进行调试

    GNU免费提供了一整套工具链,为嵌入式Linux程序的开发和调试提供了完整的支持。其强大的gdb调试工具可以方便地对嵌入式平台上的程序进行跟踪调试
    发表于 06-30 10:39 1146次阅读
    如何在VIM中对嵌入式软件进行<b class='flag-5'>调试</b>

    初学GDB调试工具需要注意的事项

    GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。相比于VS里面的图形化调试工具,其功能更加强大。
    发表于 05-16 17:45 1119次阅读
    初学<b class='flag-5'>GDB</b><b class='flag-5'>调试工具</b>需要注意的事项

    STM32CubeIDE乃ST官方提供的免费且功能强大的集成开发工具

    STM32CubeIDE乃ST官方提供的免费且功能强大的集成开发工具,令STM32Cube生态系统更为丰富强劲。它基于Eclipse/CDT框架、GCC编译工具链和GDB调试工具,并支
    的头像 发表于 03-31 15:26 5782次阅读
    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 751次阅读
    嵌入式Linux <b class='flag-5'>GDB</b>是什么

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序进程,首先先用top命令查看运行的程序进程的pid如下: 比如我要加载的程序
    的头像 发表于 11-09 17:17 845次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试工具</b>