【发布时间】:2020-06-28 22:15:22
【问题描述】:
我正在尝试使用 ptrace 做一些非常基本的事情,但我的行为非常奇怪。
unsigned long start=strtoul(start_text,NULL,16);
long start_data;
if ((start_data = ptrace(PTRACE_PEEKTEXT,child_pid,(void*)start,NULL))<0){
free_memory(vars,registers,size);
exit(1);
}
start_text是另一个程序中有效位置的字符串,start的值是正确的,child_pid的值也是正确的。
出于某种原因,对于 start 的某些值,调用可以正常工作,但对于某些值,它会失败。
我试图了解是什么原因造成的,所以我写了这个:
ptrace(PTRACE_PEEKTEXT,child_pid,(void*)start,NULL);
printf("%d",errno);
但errno 每次都是 0。
谁能解释一下导致问题的原因?
【问题讨论】:
-
ptrace 总是会在出错时设置 errno —— 但
PTRACE_PEEKTEXT可能会返回一个负值(如果读取的值为负数)而不会出错。要检测 PEEKTEXT 的错误,您需要在 ptrace 调用之前设置errno = 0并在之后检查。
标签: c system-calls