2014-01-15 68 views
1

我正在執行一個多線程應用程序和10次中的9次,斷點處理工作得很好,但有時我得到一個SIGCHLD事件而不是SIGTRAP。ptrace(PTRACE_SINGLESTEP)+ waitpid = SIGCHLD

這是序列:

  • 應用程序正在運行,主線程遇到INT3
  • 調試器的waitpid函數返回SIGTRAP
  • 調試SIGSTOPs的已經不是 「T(跟蹤站)」 的所有線程,使用tgkill
  • 調試運行的ptrace(PTRACE_SINGLESTEP)上INT3'ed螺紋
  • 調試waitpid函數的(固定RIP和的0xCC字節後),預計SIGTRAP,但得到SIGCHLD代替

我該怎麼處理這個SIGCHILD?忽略它會使調試器永遠停留在等待中。用初始PTRACE_SINGLESTEP的PTRACE_CONT螺絲將其重新注入大衆。

它似乎只發生在主線程(PID == TID)上,而不是用於childthreads(又名LWP)。

我在虛擬盒子裏使用UBUNTU 12.04 64bit。

回答

1

用PTRACE_SINGLESTEP(data param)注入SIGCHLD回到debugee似乎是個訣竅。