【问题标题】:ptrace(PTRACE_SINGLESTEP) + waitpid = SIGCHLDptrace(PTRACE_SINGLESTEP) + waitpid = SIGCHLD
【发布时间】:2014-01-15 20:57:09
【问题描述】:

我正在跟踪一个多线程应用程序,并且 10 次中有 9 次断点处理工作正常,但有时我得到一个 SIGCHLD 事件而不是 SIGTRAP。

这是顺序:

  • 应用程序正在运行,主线程命中 INT3
  • 调试器的 waitpid 返回 SIGTRAP
  • 调试器 SIGSTOP 使用 tgkill 停止所有尚未“t(跟踪停止)”的线程
  • 调试器在 INT3 线程上运行 ptrace(PTRACE_SINGLESTEP)(修复 RIP 和 0xCC 字节后)
  • 调试器 waitpid 并期望 SIGTRAP,但改为获取 SIGCHLD

我应该如何处理这个 SIGCHILD?忽略它会使调试器永远停留在后面的等待进程中。使用带有初始 PTRACE_SINGLESTEP 的 PTRACE_CONT 螺钉将其注入回被调试者。

似乎它只发生在主线程 (PID==TID) 上,而不发生在子线程 (aka LWP) 上。

我在虚拟盒子中使用 UBUNTU 12.04 64bit。

【问题讨论】:

    标签: ptrace waitpid


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2016-10-31
      相关资源
      最近更新 更多