我想在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上运行 子>