为什么当我在 C 程序中使用 ptrace PTRACE_PEEKTEXT 时出现此错误?
我在其中使用 PTRACE_PEEKTEXT 的程序部分是:
static void read_file(pid_t child, char *file)
{
char *child_addr;
int i;
child_addr = (char *) ptrace(PTRACE_PEEKUSER, child, sizeof(long)*RDI, 0);
do {
long val;
char *p;
val = ptrace(PTRACE_PEEKDATA, child, child_addr, NULL);
if (val == -1) {
fprintf(stderr, "PTRACE_PEEKTEXT error: %s", strerror(errno));
exit(1);
}
child_addr += sizeof (long);
p = (char *) &val;
for (i = 0; i < sizeof (long); ++i, ++file) {
*file = *p++;
if (*file == '\0') break;
}
} while (i == sizeof (long));
}
(它是一部分这个程序)
为什么会出现这个错误??
PTRACE_PEEKTEXT error: Input/output error[1]
答案1
根据手册页,EIO
意味着:
无效,或者尝试读取或写入跟踪器或被跟踪者内存中的无效区域,或者存在字对齐违规,或者在重新启动请求期间指定了无效信号。
所以child_addr
传递给的变量ptrace(PTRACE_PEEKDATA, ...)
可能是不正确的。一个好的开始是检查ptrace(PTRACE_PEEKUSER, ...)
错误的结果。