ptrace系统调用返回-1且errno=0
我试图用ptrace做一些非常基本的事情,但我的行为非常奇怪ptrace系统调用返回-1且errno=0,c,system-calls,C,System Calls,我试图用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); } 但是errno每次
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);
}
但是errno
每次都是0
谁能解释一下问题的原因吗?来自Linux的
ptrace
手册页:
由于
成功的PTRACE_PEEK*请求可能是-1,调用方必须在调用之前清除errno,并且
然后检查它,以确定是否发生了错误
也就是说,您正在读取的值可能恰好是-1
,或者在您的情况下,可能是其他一些负数(即设置了高位的64位值)
因此,与大多数其他系统调用函数不同,您无法通过测试返回值是否为负值来检查是否成功。你应该这样做
errno = 0;
start_data = ptrace(PTRACE_PEEKTEXT,child_pid,(void*)start,NULL));
if (errno != 0) {
// handle error
}
请注意首先设置errno=0
的重要性。与其他系统调用一样,如果ptrace
成功,则errno
的值可能保持不变。因此,除非您首先清除errno
,否则您将无法判断后面的非零值是否表示ptrace
失败,或者ptrace
是否成功,并且该值是上次失败的调用留下的
(我的手册页版本表明,
ptrace
库包装器在成功时实际上可能会将errno
设置为零,但没有明确何时设置,因此最好不要依赖此行为。)ptrace将始终在错误时设置errno,但ptrace\u peek text
可能返回负值(如果读取的值为负值)没有错误。要使用PEEKTEXT检测错误,需要在ptrace调用之前设置errno=0
,然后进行检查。挑剔:系统调用本身没有errno
的概念,ptrace
系统调用像其他任何调用一样报告错误。这个问题纯粹是libc包装的结果。
errno = 0;
start_data = ptrace(PTRACE_PEEKTEXT,child_pid,(void*)start,NULL));
if (errno != 0) {
// handle error
}