我已在我的C ++应用程序中集成了 Google-Breakpad 。现在,我故意崩溃应用程序,但它在我的Ubuntu i686系统中挂起。我必须在Breakpad中放置printf
以查看它究竟挂在哪里。因此,在breakpad中,正在创建一个克隆子进程,并且在该进程中ptrace(PTRACE_ATTACH, pid, NULL, NULL)
后跟waitpid(pid, NULL, __WALL)
syscall正在每个线程上调用。有一个特定的线程,waitpid进入无限等待状态,然后我不得不故意杀死该应用程序。
有谁知道为什么会发生这种情况?为什么这个特定的线程waitpid()
正在进入infinte等待状态?有没有相同的解决方案?
感谢。
答案 0 :(得分:0)
通常,PTRACE_ATTACH不保证进程有任何要报告的内容。在PTRACE_ATTACH之后,只有在发生以下两种情况之一时才会触发waitpid:
有些事情等于其中一件事。例如,如果debugee调用execve
,那么在成功执行之后,内核会使其显示为,就像 debugee收到TRAP
信号一样。
如果没有发生这种情况,PTRACE_ATTACH
没有理由做任何事情。
如果你想要waitpid
返回(比如说,因为你想改变debugee的状态),那么只需在调用PTRACE_ATTACH
后向线程发送一个信号。这将保证线程有东西告诉你。