调试器原理

调试器是大多数(如果不是每种)开发人员在软件工程生涯中至少使用一次的软件之一,但是你们当中有多少人知道它们的实际工作原理? 在悉尼举行的linux.conf.au 2018上的演讲中,我将谈论从头开始编写调试器...在Rust中 !

在本文中,术语调试器/跟踪器是可互换的。 “跟踪”是指跟踪程序正在跟踪的进程。

ptrace系统调用

大多数调试器严重依赖于称为ptrace(2)的系统调用,该系统调用具有以下原型:

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

这是一个系统调用,可以处理流程的几乎所有方面。 但是,在调试器可以附加到进程之前,“ tracee”必须使用请求PTRACE_TRACEME调用ptrace 。 这告诉Linux,父进程通过ptrace附加到此进程是合法的。 但是...我们如何强迫一个进程调用ptrace ? 十分简单! fork/execve提供了一种在fork之后但在tracee真正开始使用execve之前调用ptrace的简便方法。 方便地, fork也将返回tracee的pid ,这是以后使用ptrace所必需的。

现在,调试器可以跟踪该跟踪,进行了重要的更改:

  • 每次将信号传递到跟踪时,它都会停止,并且将等待事件传递到跟踪器,该事件可以由wait的系统调用系列捕获。
  • 每个execve系统调用都将导致SIGTRAP被传递给Tracee。 (与之前的项目相结合,这意味着之前的tracee停止execve可以充分利用的地方。)

这意味着,一旦我们发出PTRACE_TRACEME请求并调用execve系统调用以在跟踪中实际启动程序,由于execve传递了SIGTRAP ,并且跟踪器中的等待事件捕获了该跟踪,所以该跟踪将立即停止。 我们如何继续? 正如人们所期望的那样, ptrace有许多请求可用于告诉该跟踪继续进行下去:

  • PTRACE_CONT :这是最简单的。 跟踪将一直运行,直到接收到信号为止,这时将等待事件传递到跟踪器。 这最常用于实现实际调试器的“ continue-until-breakpoint”和“ continue-forever”选项。 断点将在下面介绍。
  • PTRACE_SYSCALL :非常相似PTRACE_CONT ,而是进入了一个系统调用之前停止,之前也一个系统调用返回到用户空间。 它可以与其他请求(我们将在本文后面介绍)结合使用,以监视和修改系统调用的参数或返回值。 strace (系统调用跟踪程序)大量使用此请求来确定进程进行了哪些系统调用。
  • PTRACE_SINGLESTEP :这是不言自明的。 如果您之前使用过调试器,则此请求将执行下一条指令,但之后立即停止。

我们可以通过各种请求来停止该过程,但是如何获取示踪的状态呢? 进程的状态主要由其寄存器捕获,因此ptrace当然有一个获取(或修改!)寄存器的请求:

  • PTRACE_GETREGS :该请求将给出停止跟踪时的寄存器状态。
  • PTRACE_SETREGS :如果跟踪器具有上一次调用PTRACE_GETREGS的寄存器值,则可以通过该请求修改该结构中的值,并将寄存器设置为新值。
  • PTRACE_PEEKUSERPTRACE_POKEUSER :这些允许从跟踪的USER区域读取,该区域保存寄存器和其他有用信息。 这可用于修改单个寄存器,而无需更重的PTRACE_{GET,SET}REGS

在调试器中修改寄存器并不总是足够的。 调试器有时需要读取存储器的某些部分,甚至对其进行修改。 GNU项目调试器(GDB)可以使用print获取内存位置或变量的值。 ptrace具有实现此功能的功能:

  • PTRACE_PEEKTEXTPTRACE_POKETEXT :这些允许在跟踪的地址空间中读取和写入单词。 当然,必须停止示踪才能起作用。

现实世界中的调试器还具有断点和观察点之类的功能。 在下一节中,我将深入介绍调试支持的体系结构细节。 为了清楚和简洁起见,本文仅考虑x86。

建筑支持

ptrace很酷,但是它如何工作? 在上一节中,我们已经看到了ptrace有相当多的做信号: SIGTRAP可以单步执行前交付, execve和之前或之后的系统调用。 信号可以通过多种方式生成,但是我们将看看两个特定的示例,调试器可以使用这些示例在给定位置停止程序(有效地创建断点!):

  • 未定义的指令:当进程尝试执行未定义的指令时,CPU会引发异常。 通过CPU中断处理此异常,然后调用与内核中的中断对应的处理程序。 这将导致SIGILL发送到该进程。 反过来,这导致进程停止,并通过等待事件通知跟踪程序。 然后,它可以决定要做什么。 在x86上,保证ud2指令ud2是未定义的。

  • 调试中断:前一种方法的问题是ud2指令占用了两个字节的机器代码。 存在一条占用一个字节并引发中断的特殊指令。 它是int $3 ,机器代码是0xCC 。 引发此中断时,内核将SIGTRAP发送到进程,并且像以前一样,通知跟踪器。

很好,但是我们如何强迫示踪执行这些指令? 容易: ptrace具有PTRACE_POKETEXT ,可以覆盖存储位置的单词。 调试器将使用PTRACE_PEEKTEXT读取该位置处的原始单词,并将其替换为0xCC ,从而记住原始字节以及该字节处于其内部状态的断点这一事实。 下次在该位置执行跟踪时,将借助SIGTRAP自动将其停止。 然后,调试器的最终用户可以决定如何继续(例如,检查寄存器)。

好的,我们已经介绍了断点,但是观察点呢? 当读取或写入某个内存位置时,调试器如何停止程序? 当然,您不会仅仅用int $3覆盖可以读取或写入某些内存位置的每条指令。 满足调试寄存器,一组旨在更有效地实现此目标的寄存器:

  • DR0DR3 :每个寄存器都包含一个地址(存储位置),调试器出于某种原因希望该跟踪停止。 原因在DR7指定为位掩码。
  • DR4DR5 :分别是DR6DR7别名。
  • DR6 :调试状态。 包含有关哪个DR0DR3引发调试异常的信息。 Linux使用它来确定与SIGTRAP一起传递给跟踪的信息。
  • DR7 :调试控件。 使用这些寄存器中的位,调试器可以控制如何解释DR0DR3中指定的地址。 位掩码控制观察点的大小(监视的是1、2、4还是8个字节),以及是否在执行,读取,写入或读取和写入时引发异常。

因为调试寄存器构成了进程USER区域的一部分,所以调试器可以使用PTRACE_POKEUSER将值写入调试寄存器。 调试寄存器仅与特定进程相关,因此在进程重新获得对CPU的控制之前,它们会抢占先恢复为该值。

冰山一角

我们看了一眼调试器的冰山一角:我们介绍了ptrace ,介绍了它的一些功能,然后看了如何实现ptraceptrace某些部分可以用软件实现,而其他部分则必须用硬件实现,否则它们将非常昂贵,甚至不可能。

当然,我们没有涉及很多。 出现诸如“调试器如何知道变量在内存中的位置?”之类的问题。 由于时间和空间的限制,请保持开放状态,但我希望您从本文中学到了一些知识; 如果它激起了您的兴趣,可以在网上找到大量资源以了解更多信息。


有关更多信息,请参加Levente Kurusa的演讲, 让我们编写调试器! , 网址为linux.conf.au ,将于1月22日至26日在悉尼举行。

翻译自: https://opensource.com/article/18/1/how-debuggers-really-work

调试器原理

调试器原理_调试器的工作原理相关推荐

  1. 双时隙的工作原理_双联开关的工作原理

    台灯的开关工作原理是什么 利用的是人体的静电.在按的过程中输入了脉冲.经芯片处理,改变亮度 采用触摸按键在结构方面非常简单方便,设计好的触摸按键电路板,直接贴在面板外壳上,然后用后盖压紧(或者其他方式 ...

  2. bmp180气压传感器工作原理_氢气传感器的工作原理及特点

    原标题:氢气传感器的工作原理及特点 氢气是一种无色无味的易燃易爆气体,人的眼睛和鼻子很难及时发现.在一些容易发生氢气泄漏的场所,若没有及时发现泄漏,当氢气在空气中达到一定浓度时,遇到火源就会发生爆炸, ...

  3. 耳挂式蓝牙耳机原理_蓝牙耳机是什么工作原理?哪款蓝牙耳机音质好?

    随着蓝牙技术的广泛普及,蓝牙耳机随处可见,目前蓝牙耳机的种类和品牌非常繁多,市场上参差不齐的产品也很多,面对这么火爆的蓝牙市场,你真的了解蓝牙耳机吗?你知道它的工作原理吗?你知道怎么选择适合自己的蓝牙 ...

  4. 边缘检测robert原理_负氧离子检测仪的工作原理与选择

    空气中负氧离子的含量是空气质量好坏的关键.在自然生态系统中,森林和湿地是产生空气负(氧)离子的重要场所.在空气净化.城市小气候等方面有调节作用,其浓度水平是城市空气质量评价的指标之一. 自然界中空气正 ...

  5. 高频开关电源原理_程控开关电源的工作原理

    本文介绍了开关电源的工作原理以及它的特点. 程控开关电源要要比线性电源复杂得多. 下图是典型的开关电源工作原理图. 首先对 220 V/50Hz 的 AC 输入,通过桥式整流器进行整流 储能电容对整流 ...

  6. 简述ospf的工作原理_简述洛氏硬度计的工作原理及应用领域

    简述洛氏硬度计的工作原理及应用领域,其采用金刚石锥体或钢球作为压头.它应用一个次要负载,接着是一个主要负载,然后将负载减少到 初的次要负载.材料的硬度通过使用线性测量仪或其他工具从次要负载的第二次穿透 ...

  7. 加密机工作原理_三相异步电动机的工作原理

    三相异步电动机的工作原理,是基于定子旋转磁场和转子电流的相互作用,详细情况见下图︰ 当电动机定子绕组通过三相电流时,各相绕组中的电流都将产生自己的磁场.由于电流随时间变化,它们产生的磁场也将随时间变化 ...

  8. bmp180气压传感器工作原理_陕西压力传感器的工作原理信息推荐

    压力传感器的工作原理应用广泛的是压阻式压力传感器,它具有极低的价格和较高的精度以及较好的线性特性.下面我们主要介绍这类陕西压力传感器.在了解陕西压力传感器时,我们首先认识一下电阻应变片这种元件.电阻应 ...

  9. 三极管工作原理_三极管的基本工作原理,这个讲的很全

    晶体三极管简介 晶体三极管是p型和n型半导体的有机结合,两个pn结之间的相互影响,使pn结的功能发生了质的飞跃,具有电流放大作用.晶体三极管按结构粗分有npn型和pnp型两种类型.如图2-17所示,( ...

  10. 传感器工作原理_荧光氧气传感器工作原理简介

    冷发光是一种电子激发的物质在激发时发出的紫外线(UV).可见光(Vis)和红外线(IR)光.而光的吸收和发射之间的过程通常用一个能量级图来说明,即雅布朗斯基图.下面工采网小编通过光学原理给大家说说荧光 ...

最新文章

  1. 移动端1px像素的设置?
  2. 第二十二讲 对角化分解和幂公式
  3. 飞利浦dicom_如何按计划打开或关闭飞利浦色相灯
  4. 开源的负载测试/压力测试工具 NBomber
  5. 如何和何时使用 CSS 的权重设置 !important (建议:永不使用!)
  6. 块状元素的居中,首先设置宽度,再设 margin: 0 auto
  7. 摄像头拍摄后对图片进行图像处理-python(空域增强)
  8. Flutter学习之纵向布局
  9. Bootstrap3 滚动监听插件的选项
  10. JS面向对象系列之一[prototype,原型]
  11. 电源反接保护电路:MOS防电源反接电路、自恢复保险丝过流反接保护电路
  12. Flash制作空战游戏
  13. SIMD and Avx2
  14. 超星武汉分公司实习(web前端)第一周
  15. 非常感人的分手对白:伤感日志
  16. 数据定义语言 - DDL
  17. SDNU-1093.DNA排序
  18. 【毕业设计】深度学习花卉识别系统 - 卷积神经网络 机器视觉
  19. 职业规划之前请认真读读以下19个故事(3)
  20. python 大气校正_PIE二次开发——大气校正

热门文章

  1. Nginx应用场景之反向代理
  2. mysql中常用的时间工具
  3. 多线程顺序打印的5种解法
  4. 正则基础之——非捕获组
  5. Unity-多核优化1-C#JobSystem
  6. 并发编程---ConcurrentHashMap源码解析
  7. TCP/IP 详解 卷一 协议 (第二版)翻译问题(第一周)2018
  8. 用CSS让文字居于div的底部
  9. Django 源码阅读
  10. 李廷伟:可穿戴技术引领物联网创新新浪潮