在macOS上,Ptrace或waitpid卡在C中
我想在OSX上用ptrace编写一个小型调试器 我希望父进程使子进程逐步运行 这是我尝试过的,但程序有时会卡住,它似乎处于无限循环中或被冻结在macOS上,Ptrace或waitpid卡在C中,c,macos,ptrace,waitpid,C,Macos,Ptrace,Waitpid,我想在OSX上用ptrace编写一个小型调试器 我希望父进程使子进程逐步运行 这是我尝试过的,但程序有时会卡住,它似乎处于无限循环中或被冻结 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <sys/user.h> #include <sys/types
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/user.h>
#include <sys/types.h>
#include <sys/ptrace.h>
int main(void)
{
pid_t id = fork();
if (id < 0)
return 1;
else if (id == 0)
{
ptrace(PT_TRACE_ME, 0, 0, 0);
printf("Point 1\n");
kill(getpid(), SIGSTOP);
printf("Point 2\n");
exit(1);
}
else
{
while (1)
{
int status = 0;
pid_t retpid = waitpid(id, &status, WUNTRACED);
if (retpid < 0)
{
printf("Waitpid error\n");
exit(3);
}
if (WIFSTOPPED(status))
{
int ret = ptrace(PT_STEP, id, (caddr_t)1, 0);
if (ret < 0)
{
printf("Ptrace error\n");
exit(2);
}
}
else
{
printf("Program has terminated\n");
exit(0);
}
}
}
}
我不知道我做错了什么
在macOS Sierra 10.12.6和Apple LLVM 8.1.0版(clang-802.0.42)上运行
对我来说,它挂在第四次迭代El Capitan上。有趣的是:如果我将
sleep(1)
放在PT\u步骤
行之前,它会立即挂在第一个点1
之后。发布的代码缺少以下语句:\include
以公开waitpid()
函数。函数:ptrace()
返回一个long int
,而不是int
@user3629249:不是这样。你的陈述对Linux来说是正确的。对于macOS,它是int
。
Point 1
Point 2