在PTRACE_ATTACH之后,waitpid处于infitine等待状态

时间:2016-10-27 08:26:46

标签: c++14 ptrace google-breakpad

我已在我的C ++应用程序中集成了 Google-Breakpad 。现在,我故意崩溃应用程序,但它在我的Ubuntu i686系统中挂起。我必须在Breakpad中放置printf以查看它究竟挂在哪里。因此,在breakpad中,正在创建一个克隆子进程,并且在该进程中ptrace(PTRACE_ATTACH, pid, NULL, NULL)后跟waitpid(pid, NULL, __WALL) syscall正在每个线程上调用。有一个特定的线程,waitpid进入无限等待状态,然后我不得不故意杀死该应用程序。

有谁知道为什么会发生这种情况?为什么这个特定的线程waitpid()正在进入infinte等待状态?有没有相同的解决方案?

感谢。

1 个答案:

答案 0 :(得分:0)

通常,PTRACE_ATTACH不保证进程有任何要报告的内容。在PTRACE_ATTACH之后,只有在发生以下两种情况之一时才会触发waitpid:

  • debugee收到一个信号。
  • debugee存在。

有些事情等于其中一件事。例如,如果debugee调用execve,那么在成功执行之后,内核会使其显示为,就像 debugee收到TRAP信号一样。

如果没有发生这种情况,PTRACE_ATTACH没有理由做任何事情。

如果你想要waitpid返回(比如说,因为你想改变debugee的状态),那么只需在调用PTRACE_ATTACH后向线程发送一个信号。这将保证线程有东西告诉你。