kid*_*dd0 12 c ptrace system-calls strace
在发布了很多问题后ptrace(最近的5个问题是我的:())当我更换时,我终于得到了所需的输出
reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);
Run Code Online (Sandbox Code Playgroud)
同
reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);
Run Code Online (Sandbox Code Playgroud)
手册页中提到的差异是这样的
PTRACE_PEEKTEXT 在孩子的记忆中的位置addr读取一个单词PTRACE_PEEKUSER 在孩子的USER区域的偏移地址处读取一个单词我无法从手册页中单独理解这种差异.谁能教育我更多吗?
Pav*_*ath 21
PTRACE_PEEKDATA用于读取子项的数据/代码部分(一般过程 - 所谓的tracee).如您所知,调试器使用ptrace了很多.他们可以使用此调用来检查变量的值.例如,GDB/DBX如果你说的话
print count
Run Code Online (Sandbox Code Playgroud)
调试器将在内部调用ptrace与PTRACE_PEEKDATA和发现它的价值.
PTRACE_PEEKUSER用于读取子项USER区域的内容,该区域包含寄存器和其他信息的内容.sys/user.h列出了其他信息.
例如USER区域包含,
struct user_regs_struct
{
long int ebx;
long int ecx;
long int edx;
long int esi;
long int edi;
long int ebp;
long int eax;
long int xds;
long int xes;
long int xfs;
long int xgs;
long int orig_eax;
long int eip;
long int xcs;
long int eflags;
long int esp;
long int xss;
};
Run Code Online (Sandbox Code Playgroud)
简而言之:
PTRACE_PEEKDATA 用于程序数据(例如变量)和代码;PTRACE_PEEKUSER 适用于寄存器值和其他调试信息;注意之间的等价PTRACE_PEEKDATA和PTRACE_PEEKTEXT.来自man ptrace:
Linux没有单独的文本和数据地址空间,因此这两个请求当前是等效的.