ptrace是gdb实现的基石,本文简要介绍一下ptrace.

ptrace

linux提供的系统调用ptrace,使得一个进程可以attach到另一个进程并进而完整的控制被attach上的进程。

被控制的内容包括但不局限于下述所列

  1. 文件描述符
  2. 内存
  3. 寄存器
  4. 信号

能够观察到被控制进程的单步执行指令,能够设置断点,等等。

ptrace调用接口定义如下所示

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

每个参数的具体含义就不作解释了,可以参考相应的manpage.

与接口相对应的是内核在process最重要的数据结构task_struct中定义了一个ptrace成员变量。这样通过ptrace系统调用接口与相应的进程数据结构挂起钩来。

  1. struct task_struct {
  2. volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
  3. void *stack;
  4. atomic_t usage;
  5. unsigned int flags; /* per process flags, defined below */
  6. unsigned int ptrace;
  7.  
  8. int lock_depth; /* BKL lock depth */

Demo

我们可以写一个小的demo程序来演示如何使用ptrace.

  1. #include <sys/ptrace.h>
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <unistd.h>
  5. #include <sys/user.h> /* For constants
  6. ORIG_EAX etc */
  7. int main()
  8. { pid_t child;
  9. long orig_eax;
  10. child = fork();
  11. if(child == ) {
  12. ptrace(PTRACE_TRACEME, , NULL, NULL);
  13. execl("/bin/ls", "ls", NULL);
  14. }
  15. else {
  16. wait(NULL);
  17. orig_eax = ptrace(PTRACE_PEEKUSER,
  18. child, * ORIG_EAX,
  19. NULL);
  20. printf("The child made a "
  21. "system call %ld\n", orig_eax);
  22. ptrace(PTRACE_CONT, child, NULL, NULL);
  23. }
  24. return ;
  25. }

执行结果为

  1. The child made a system call

参考资料

  1. playing with ptrace http://www.linuxjournal.com/article/6100?page=0,0
  2. process tracing using ptrace http://linuxgazette.net/issue81/sandeep.html
  3. gdb的基本工作原理 http://www.spongeliu.com/240.html

每天学点GDB 13的更多相关文章

  1. 小白学 Python(13):基础数据结构(字典)(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  2. 123457123456#0#-----com.threeapp.XueShuXue013----儿童学数学(13种方法)

    com.threeapp.XueShuXue013----儿童学数学(13种方法)

  3. 尚学python课程---13、python基础语法

    尚学python课程---13.python基础语法 一.总结 一句话总结: legend2系统使我能够快速掌握一门语法,特别有用 pass 语句:空语句:是为了保持程序结构的完整性  :作用:比如: ...

  4. 立足GitHub学编程:13个不容错过的Java项目

    立足GitHub学编程:13个不容错过的Java项目 今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自 ...

  5. 每天学点GDB 15

    本节重点描述两个gdb集成测试环境 有没有办法在一边调试的时候,一边显示对应的源码呢?有没有一种工具能够将gdb集成到ide中呢,本文就试图回答这些问题. emacs gdb 在linux的世界里,e ...

  6. 每天学点GDB 12

    本文介绍在archlinux环境下,如何进行内核使用gdb配合qemu进行调试.   1. 安装qemu   2. 编译linux kernel 选择最新的内核版本,规避gcc编译出错的问题具体步骤如 ...

  7. 每天学点GDB 11

    为了跟踪glibc库中函数的执行,需要带有debug symbol的glibc, 如果是debian或者是基于debian的发行版本如ubuntu和linuxmint之类的,很简单执行如下指令安装即可 ...

  8. 【快学springboot】13.操作redis之String数据结构

    前言 在之前的文章中,讲解了使用redis解决集群环境session共享的问题[快学springboot]11.整合redis实现session共享,这里已经引入了redis相关的依赖,并且通过spr ...

  9. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

随机推荐

  1. PA

    [题目描述] 汉诺塔升级了:现在我们有?个圆盘和?个柱子,每个圆盘大小都不一样, 大的圆盘不能放在小的圆盘上面,?个柱子从左到右排成一排.每次你可以将一 个柱子上的最上面的圆盘移动到右边或者左边的柱子 ...

  2. Codeforces Round #321 (Div. 2)C(tree dfs)

    题意:给出一棵树,共有n个节点,其中根节点是Kefa的家,叶子是restaurant,a[i]....a[n]表示i节点是否有猫,问:Kefa要去restaurant并且不能连续经过m个有猫的节点有多 ...

  3. jquery学习笔记---插件开发模式和结构

    JQuery插件开发http://www.cnblogs.com/damonlan/archive/2012/04/06/2434460.html github教程:https://github.co ...

  4. ytu 1939:统计元音(水题)

    统计元音 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 68  Solved: 33[Submit][Status][Web Board] Descrip ...

  5. js event 事件兼容浏览器 ie不需要 event参数 firefox 需要

    js event 事件兼容浏览器    ie不需要 event参数   firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  6. poj 1935(树形dp)

    题目链接:http://poj.org/problem?id=1935 思路:首先我们考虑从源点出发到所有自己想要经过的点然后在回到源点sum,显然每条边都必须经过源点(这个我们可以一次dfs求出), ...

  7. Cygwin: connection closed by ::1

    问题描述:在Win7下Cygwin中,使用ssh localhost命令, 出现Connectionclosedby::1的问题. 解决方案:1.我的电脑-管理-找到CYGWINsshd. 2.右键 ...

  8. js:数据结构笔记12--排序算法(2)

    高级排序算法:(处理大数据:百万以上) 希尔排序:是插入排序的优化版: 首先设置间隔数组,然后按照每个间隔,分别进行排序: 如第一个间隔为5,首先a[5]与a[0]进行插入排序;然后a[6]和a[0] ...

  9. TYVJ P1070 罗马数字 Label:一定要看的枚举

    描述 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1  L 50  M 1000V 5  C 100X 10 D 500最多3个同样的可以表示为10 ...

  10. 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)

    http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...