Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ptrace系统调用返回-1且errno=0_C_System Calls - Fatal编程技术网

ptrace系统调用返回-1且errno=0

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每次

我试图用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
每次都是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
}