我正在跟踪一个多线程应用程序,10 次中有 9 次,断点处理工作得很好,但有时我得到一个 SIGCHLD 事件而不是 SIGTRAP。
这是顺序:
- 应用程序正在运行,主线程命中 INT3
- 调试器的 waitpid 返回 SIGTRAP
- 调试器 SIGSTOP 使用 tgkill 对尚未“t(跟踪停止)”的所有线程进行 SIGSTOP
- 调试器在 INT3 线程上运行 ptrace(PTRACE_SINGLESTEP)(在修复 RIP 和 0xCC 字节之后)
- 调试器 waitpid 并期望 SIGTRAP,但改为获取 SIGCHLD
我应该用这个 SIGCHILD 做什么?忽略它会使调试器永远停留在后面的等待进程中。使用带有初始 PTRACE_SINGLESTEP 的 PTRACE_CONT 螺钉将其注入被调试者。
似乎它只发生在主线程(PID==TID),而不是子线程(又名 LWP)。
我在虚拟框中使用 UBUNTU 12.04 64bit。