Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
在x64或x86上未定义PTRACE_SYSEMU和PTRACE_SYSEMU_单步?_C_Linux_Ptrace - Fatal编程技术网

在x64或x86上未定义PTRACE_SYSEMU和PTRACE_SYSEMU_单步?

在x64或x86上未定义PTRACE_SYSEMU和PTRACE_SYSEMU_单步?,c,linux,ptrace,C,Linux,Ptrace,我的代码如下: #include <sys/ptrace.h> #include <stdio.h> int main() { printf("PTRACE_CONT: %d\n", PTRACE_CONT); printf("PTRACE_SYSCALL: %d\n", PTRACE_SYSCALL); printf("PTRACE_SINGLESTEP: %d\n", PTRACE_SINGLESTEP); printf("PTRAC

我的代码如下:

#include <sys/ptrace.h>
#include <stdio.h>

int
main()
{
    printf("PTRACE_CONT: %d\n", PTRACE_CONT);
    printf("PTRACE_SYSCALL: %d\n", PTRACE_SYSCALL);
    printf("PTRACE_SINGLESTEP: %d\n", PTRACE_SINGLESTEP);
    printf("PTRACE_SYSEMU: %d\n", PTRACE_SYSEMU);
    printf("PTRACE_SYSEMU_SINGLESTEP: %d\n", PTRACE_SYSEMU_SINGLESTEP);
    printf("PTRACE_LISTEN: %d\n", PTRACE_LISTEN);
    return 0;
}
#包括
#包括
int
main()
{
printf(“PTRACE\u CONT:%d\n”,PTRACE\u CONT);
printf(“PTRACE\u系统调用:%d\n”,PTRACE\u系统调用);
printf(“PTRACE_SINGLESTEP:%d\n”,PTRACE_SINGLESTEP);
printf(“PTRACE\u SYSEMU:%d\n”,PTRACE\u SYSEMU);
printf(“PTRACE\u SYSEMU\u SINGLESTEP:%d\n”,PTRACE\u SYSEMU\u SINGLESTEP);
printf(“PTRACE\u-LISTEN:%d\n”,PTRACE\u-LISTEN);
返回0;
}
我正在使用Ubuntu16.04(Linux x86_64 4.40-38)上的默认标志编译gcc v5.4.0

这会引发一个未声明的错误
PTRACE\u SYSEMU
。而
man ptrace
页面。如果包含
PTRACE\u SYSEMU
的行被注释掉,则对
PTRACE\u SYSEMU\u SINGLESTEP
重复此操作。手册页中指出的
PTRACE\u SYSEMU\u SINGLESTEP
仅适用于x86,在2008年处理
PTRACE\u SYSEMU\u SINGLESTEP

这会在32位(井i686)或64位(AMD64)上产生相同的错误。这个发行版是特定的吗?发生了什么事

我无法确认这两个值都未在我的
/usr/include/x86\u 64/linux/sys/ptrace.h
中定义。但是它们是在内核源代码中定义的

在Ubuntu 16.04(以及14.04)上,这些都是在
中定义的,它包含在
中,而
又包含在
中,但不包含在


由于这些请求代码是特定于linux的(不是任何标准的一部分),如果您需要它们,您需要
#包括

Sysemu在用户模式linux中作为优化使用,并在现场进行描述。它是UML的特性(当特殊内核作为普通进程运行时),而不是
ptrace
的典型用户

它在x86Linux中的实现可以通过linux内核lxr中的
TIF\u SYSCALL\u EMU
标志来检查(
ptrace\u resume

唯一的定义是针对x86:


非常感谢。我发誓,在我的测试中,我一定是拼错了一个变量,然后在画牦牛棚时跑掉了。在2015年,为ARM实现这一点的补丁非常简单:
767 static int ptrace_resume(struct task_struct *child, long request,
768                          unsigned long data)
   ...
780 #ifdef TIF_SYSCALL_EMU
781         if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
782                 set_tsk_thread_flag(child, TIF_SYSCALL_EMU);
783         else
784                 clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
785 #endif
 85 #define TIF_SYSCALL_EMU         6       /* syscall emulation active */