#include <sys/ptrace.h>long ptrace(enum __ptrace_request request, pid_t pid,void *addr, void *data);

说明:ptrace系统调用提供了一种方法来让父进程可以观察和控制其它进程的执行,检查和改变其核心映像以及寄存器。 主要用来实现断点调试和系统调用跟踪。(man手册)

其实,说到这里,一切原理层面应该都比较明朗了(且先不去管内核中是怎么实现ptrace的)。gdb就是调用这个系统调用,然后通过一些参数来控制其他进程的执行的。

下面我们来看ptrace函数中request参数的一些主要选项:

PTRACE_TRACEME:表示本进程将被其父进程跟踪,交付给这个进程的所有信号,即使信号是忽略处理的(除SIGKILL之外),都将使其停止,父进程将通过wait()获知这一情况。

这是什么意思呢?我们可以结合到gdb上来看。如果在gdb中run一个程序,首先gdb会fork一个子进程,然后该子进程调用ptrace系统调用,参数就是PTRACE_TRACEME,然后调用一个exec执行程序。基本过程是这样,细节上可能会有出入。需要注意的是,这个选项PTRACE_TRACEME是由子进程调用的而不是父进程!

以下选项都是由父进程调用:

PTRACE_ATTACH:attach到一个指定的进程,使其成为当前进程跟踪的子进程,而子进程的行为等同于它进行了一次PTRACE_TRACEME操作。但是,需要注意的是,虽然当前进程成为被跟踪进程的父进程,但是子进程使用getppid()的到的仍将是其原始父进程的pid。

这下子gdb的attach功能也就明朗了。当你在gdb中使用attach命令来跟踪一个指定进程/线程的时候,gdb就自动成为改进程的父进程,而被跟踪的进程则使用了一次PTRACE_TRACEME,gdb也就顺理成章的接管了这个进程。

PTRACE_CONT:继续运行之前停止的子进程。可同时向子进程交付指定的信号。

这个选项呢,其实就相当于gdb中的continue命令。当你使用continue命令之后,一个被gdb停止的进程就能继续执行下去,如果有信号,信号也会被交付给子进程。

除了以上这几个选项,ptrace还有很多其他选项,可以在linux下阅读man手册:man ptrace

需要注意的另一点是,使用gdb调试过多线程/进程的人应该都知道,当子进程遇到一个信号的时候,gdb就会截获这个信号,并将子进程暂停下来。这是为什么呢?

实际上,在使用参数为PTRACE_TRACEME或PTRACE_ATTACH的ptrace系统调用建立调试关系之后,交付给目标程序的任何信号(除SIGKILL之外)都将被gdb先行截获,或在远程调试中被gdbserver截获并通知gdb。gdb因此有机会对信号进行相应处理,并根据信号的属性决定在继续目标程序运行时是否将之前截获的信号实际交付给目标程序。

原文链接:http://blog.sae.sina.com.cn/archives/3453

gdb工作原理(一)相关推荐

  1. gdb工作原理(二)

    一.组成架构 二.ptrace系统调用 ptrace系统调用对原型 long ptrace(enum __ptrace_request request, pid_t pid,void *addr, v ...

  2. 调试器原理_调试器的工作原理

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

  3. 庖丁解牛Linux内核分析01:操作系统工作原理基础

    目录 1 存储程序计算机工作模型 2 IA-32汇编基础 2.1 寄存器概述 2.1.1 通用寄存器 2.1.2 段寄存器 2.1.3 标志寄存器 2.2 数据格式 2.3 寻址方式 2.3.1 立即 ...

  4. nginx的工作原理与nginx的配置

    1.nginx的工作原理 nginx的模块直接被编译进nginx,因此属于静态编译方式. 启动nginx后,nginx的模块被自动加载,与Apache不一样,首先将模块编译为一个so文件,然后在配置文 ...

  5. 转载 调试器工作原理

    调试器工作原理--基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关于Li ...

  6. fastdfs工作原理

    讲完了云盘项目的设置,现在来讲一讲云盘中核心fastdfs的框架. 在介绍工作原理之前,先介绍fastdfs的传输协议. 服务之间的通信协议,遵循 header + body的设计原则. header ...

  7. 调试器工作原理——基础篇

    #include <stdio.h>int main(){printf("Hello, world!n");return 0;} 本文是一系列探究调试器工作原理的文章的 ...

  8. python调试器原理_调试器工作原理——基础篇

    本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关于Linux下的调试器实现的主要 ...

  9. 调试器工作原理系列一: 基础篇

    调试器工作原理系列一: 基础篇 本文是一系列探究调试器工作原理的文章的第一篇.我还不确定这个系列需要包括多少篇文章以及它们所涵盖的主题,但我打算从基础知识开始说起. 关于本文 我打算在这篇文章中介绍关 ...

最新文章

  1. 空气球+操作系统,海尔智能家居雄心何在?
  2. [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
  3. C++ static、const对象声明与定义
  4. 提高sql性能的方法
  5. DAY97 - Rest Framework(二)- 序列化组件之Serializer和ModelSerializer
  6. 通孔的作用是什么linux,电路板空洞的作用是什么 如何区分PTH与NPTH两种通孔
  7. ren命令linux,Linux mren命令
  8. 大写的“极简” H3C MSG360系列网关
  9. linux中源码安装node
  10. python编程入门经典-Python编程入门经典PDF文档免费下载
  11. linux系统安全加固基础篇1
  12. 【技巧】LeetCode 86. Partition List
  13. Xplanner 项目规划跟踪工具
  14. 微信小程序 - 贝塞尔曲线(购物车效果)
  15. 经典6位半HP34401A电路图
  16. mysql复制表结构创建新表
  17. 解决IDEA连接mysql时出现Server returns invalid timezone问题一劳永逸的方法
  18. 【洛谷题解】B2033 A*B 问题
  19. 【Spikingjelly】SNN框架教程的代码解读_5
  20. matlab级数求和阶乘,(阶乘)数列求和 - 数学 - 小木虫 - 学术 科研 互动社区

热门文章

  1. python手机版下载3.7.3-QPython3手机版下载
  2. python装饰器类-python装饰器2:类装饰器
  3. python3爬虫实例-python3 网络爬虫 实例1
  4. 数据结构 python的书推荐-java数据结构书一般推荐看什么好?
  5. python程序只能使用源代码进行运行吗-谈谈 Python 程序的运行原理
  6. pythonista3使用教程-pythonista3中文教程
  7. 学python有哪些用途-初入门学习python有哪些用途?
  8. python中文意思k-对python中的*args与**kwgs的含义与作用详解
  9. python3读取excel数据-Python3操作Excel文件(读写)的简单实例
  10. python中文教程-中谷python中文视频教程(全38集)