Skip to content

4 Linux系统与CPU调试支持

hurley edited this page May 5, 2018 · 8 revisions

Linux系统调试支持

在第2章里,我们介绍了Linux下对进程的隔离机制。一个进程是没办法直接读写另一个进程内存地址空间的数据的,更别说控制其行为了。而对于调试器来说,这些功能却至关重要。为了满足调试器的需求,操作系统乃至硬件架构都提供了相关的特性来支持调试。

首先看Linux系统层面,当调试器进程尝试控制被调试进程和读写其内存数据的时候,如何向操作系统发起请求呢?操作系统提供服务申请和权限审核的途径是什么呢?系统调用?没错,就是系统调用。Linux系统提供了ptrace(2)这个系统调用来支持调试行为。其接口定义如下:

#include <sys/ptrace.h>

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

其中 request 参数是要执行的请求类型,这个类型决定后面几个参数是否需要传入有意义的值,request 的主要取值和含义有:

PTRACE_TRACEME     ——
PTRACE_PEEKTEXT    ——
PTRACE_PEEKDATA    ——
PTRACE_PEEKUSER    ——
PTRACE_POKETEXT    ——
PTRACE_POKEDATA    ——
PTRACE_POKEUSER    ——
PTRACE_CONT        ——
PTRACE_KILL        ——
PTRACE_SINGLESTEP  ——
PTRACE_GETREGS     ——
PTRACE_SETREGS     ——
PTRACE_GETFPREGS   ——
PTRACE_SETFPREGS   ——
PTRACE_ATTACH      ——
PTRACE_DETACH      ——
PTRACE_GETFPXREGS  ——
PTRACE_SETFPXREGS  ——
PTRACE_SYSCALL     ——
PTRACE_SETOPTIONS  ——
PTRACE_GETEVENTMSG ——
PTRACE_GETSIGINFO  ——
PTRACE_SETSIGINFO  ——
PTRACE_GETREGSET   ——
PTRACE_SETREGSET   ——
PTRACE_SEIZE       ——
PTRACE_INTERRUPT   ——
PTRACE_LISTEN      ——
PTRACE_PEEKSIGINFO ——
PTRACE_GETSIGMASK  ——
PTRACE_SETSIGMASK  ——
Clone this wiki locally