-
Notifications
You must be signed in to change notification settings - Fork 7
4 Linux系统与CPU调试支持
hurley edited this page May 5, 2018
·
8 revisions
在第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 ——