Ptrace sigtrap在做单步操作和调用系统调用时

时间:2011-10-23 23:50:42

标签: linux signals system-calls ptrace

我正在编写使用 ptrace 的单步测试的应用程序。总的来说,这有效,但我有一个问题。这就是我所做的:

  • 来自 waitpid 我知道跟踪过程已经停止,因为信号已经发送。
  • 如果信号是 SIGTRAP ,请确保这不是任何特殊情况,例如 PTRACE_EVENT _ * ,等等......
  • 检查这是否是由singlestep或hw断点引起的(通过检查 DR_STATUS 为DR_SINGLESTEP / DR_TRAPx ,或检查siginfo的si.code为TRAP_TRACE / TRAP_HWBKPT
  • 如果是 NOT 单步或断点则假定此信号应传递给跟踪过程。

这是有效的,直到被追踪的程序在单步执行期间使用系统调用 当它这样做时,SIGTRAP将被交付,并且检查singlestep / hw断点会给出答案,这不是这些,所以SIGTRAP被交付。这是错误的,因为跟踪过程本身不会做任何应该导致SIGTRAP的事情,所以不应该传递这个。

我现在检查的内容:
- 当没有追踪过程时(当然),这不会发生 - 当跟踪过程而不是单步处理时,不会发生这种情况 - 发生这种情况时,DR_TRAPx和DR_SINGLESTEP未设置
- 当发生这种情况时siginfo的si.code == TRAP_BKPT (而不是像断点一样的TRAP_HWBKPT)
- 32位应用程序由32位跟踪器跟踪,32位应用程序跟踪器跟踪32位,64位跟踪器跟踪64位时发生这种情况。

我的问题是:为什么我会收到此SIGTRAP?
(这个exacly来自/可以在其他情况下发生TRAP_BKPT吗?)

0 个答案:

没有答案