1

我正在跟踪一个多线程应用程序,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。

4

1 回答 1

1

将带有 PTRACE_SINGLESTEP(数据参数)的 SIGCHLD 注入被调试者似乎可以解决问题。

于 2014-01-20T19:56:41.847 回答