Ptrace或waitpid卡在macOS上的C中

时间:2018-02-06 17:13:39

标签: c macos ptrace waitpid

我想在OS X上用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);
            }
        }
    }
}

使用cc bug.c进行编译,使用while true; do ./a.out; done运行,等待30秒后会冻结。

冻结时,最后一行是:

Point 1
Point 2

我无法弄清楚我做错了什么。

<子> 使用Apple LLVM版本8.1.0(clang-802.0.42)在macOS Sierra 10.12.6上运行

0 个答案:

没有答案