linux应用程序调试的基石---ptrace

本文深入解析ptrace系统调用,详细解释其如何作为进程调试器(如gdb,strace)与操作系统之间的接口。阐述了ptrace在子进程fork后,父进程如何利用该调用来跟踪子进程,包括访问内核映像、寄存器状态等关键信息的过程。同时,介绍了ptrace的移植性限制和其在用户空间与内核空间之间的交互方式。
摘要由CSDN通过智能技术生成

文章出处:http://blog.csdn.net/estate66/article/details/5985746


    ptrace是process 和 trace的简写,直译为进程的跟踪。它是操作系统提供给应用程序调试器诸如gdb,strace的系统调用接口(API)。

    具体过程为:父进程首先进行fork调用,并在子进程中执行ptrace函数,将PTRACE_TRACEME赋值给request形参,紧接着在子进程中执行exec调用完后。将控制权交给父进程,通过使用PTRACE_ATTACH,父进程开始跟踪子进程,每一次被跟踪的子进程都会向父进程发送一个信号。父进程可以忽略掉大部分信号,仅有的一个例外是SIGKILL信号。在跟踪子进程的过程中,父进程可以查看和修改子进程的内核映像及寄存器的值,暂停子进程的执行。在跟踪完成后,可以选择子进程继续执行还是终止。

    ptrace函数是高度依赖底层的架构,因此,它的移植性受到一定的限制。



    ptrace运行在内核空间,而gdb和strace运行在用户空间。由上图可知,ptrace构成了应用程序调试的基础。

    ptrace系统调用的格式如下:

    #include

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

    其中,request决定了ptrace执行哪种任务,pid则表示被跟踪和监视的子进程。addr表示子进程用户空间地址的偏移量,data表示子进程的一些数据指针,这些数据是监视它的父进程想要查看的。

request 请求一般有如下几种:

PTRACE_TRACEME

PTRACE_PEEKTEXT,  PTRACE_PEEKDATA

PTRACE_PEEKUSR

PTRACE_POKETEXT,  PTRACE_POKEDATA

PTRACE_POKEUSR

PTRACE_GETREGS,  PTRACE_GETFPREGS

等等

    在所有如上请求中,只有PTRACE_TRACEME是在子进程使用,在ptrace函数中的其他参数一般可以忽略。其余的请求一般在父进程中使用。在ptrace函数中的其他参数如pid_t标识被监视的子进程的进程标识号。addr是子进程的内存地址,而data表示想要获取的数据指针。






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值