1

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

有谁知道为什么会发生这种情况?为什么这个特定线程waitpid()处于无限等待状态?有没有相同的解决方案?

谢谢。

4

1 回答 1

0

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

  • 被调试者接收到一个信号。
  • 被调试者存在。

有些事情就等于其中之一。例如,如果被调试者调用execve,那么在成功执行之后,内核会使其看起来好像被调试者收到了一个TRAP信号。

如果这些情况都没有发生,那么根本没有理由PTRACE_ATTACH做任何事情。

如果你想waitpid返回(比如说,因为你想改变被调试者的状态),那么只需在调用PTRACE_ATTACH. 这将保证线程有话要告诉你。

于 2016-10-29T06:56:19.930 回答