在ptrace上发布了许多问题(最近的5个问题是我的:( ))之后,当我替换时,我终于得到了所需的输出
reg_val[1] = ptrace(PTRACE_PEEKDATA, child, 4 * EBX, NULL);使用
reg_val[1] = ptrace(PTRACE_PEEKUSER, child, 4 * EBX, NULL);手册页中提到的区别如下
PTRACE_PEEKTEXT在子内存中的地址读取一个单词PTRACE_PEEKUSER在子用户区域的偏移加号处读取一个单词我无法仅从手册页中理解这种差异。有人能教我更多这方面的知识吗?
发布于 2012-03-21 11:54:25
PTRACE_PEEKDATA用于读取子程序的数据/代码部分(一般为进程--也就是所谓的tracee)。如您所知,调试器经常使用ptrace。他们可以使用这个调用来检查变量的值。例如,在GDB/DBX中,如果您说
print count调试器将在内部使用ptrace调用PTRACE_PEEKDATA并找到它的值。
PTRACE_PEEKUSER用于读取子用户区域的内容,该区域保存寄存器和其他信息的内容。sys/user.h列出了其他信息。
例如,用户区域包含,
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;
};In
PTRACE_PEEKDATA用于程序数据(例如变量)和代码;PTRACE_PEEKUSER用于诸如寄存器值和其他调试信息;注意PTRACE_PEEKDATA和PTRACE_PEEKTEXT__之间的等价性。来自http://man7.org/linux/man-pages/man2/ptrace.2.html
Linux没有单独的文本和数据地址空间,因此这两个请求目前是等效的。
https://stackoverflow.com/questions/9803908
复制相似问题