在macOS上,Ptrace或waitpid卡在C中

在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

我想在OSX上用ptrace编写一个小型调试器

我希望父进程使子进程逐步运行

这是我尝试过的,但程序有时会卡住,它似乎处于无限循环中或被冻结

#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