我正在用C ++编写一个程序,它使用ptrace跟踪另一个进程的系统调用。我有一个辅助函数,用于确定子进程是否具有一个状态,指示它已在系统调用的入口或出口处停止:
static bool isSysCall(int status) {
return WSTOPSIG(status) == (SIGTRAP | 0x80);
}
在gdb下运行时,当单步执行子进程的系统调用时,此函数返回true(应该如此)。但是,当我在没有gdb的情况下运行此程序时,此函数始终返回false,导致我的程序无法确定子进程何时进入/退出系统调用。这种与gdb vs的行为差异导致我的跟踪程序在gdb中正确运行但在没有gbd运行时失败。我怎样才能让这个函数在有/没有GDB的情况下返回相同的东西?
其他信息: 通过调用
跟踪子进程的ptraceptrace(PTRACE_TRACEME);
在子进程中,在父进程中我使用
ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
设置由
更改的状态的第7位waitpid(pid, &status, 0);
当有系统调用时,如ptrace man page中所述。上面的(看似有问题的)辅助函数仅用于检查第7位。