Ptrace sigtrap при выполнении одиночного шага и вызове системного вызова - PullRequest
0 голосов
/ 24 октября 2011

Я пишу приложение, которое использует ptrace .В целом это работает, но у меня есть один вопрос.Вот что я делаю:

  • из waitpid Я знаю, что отслеживаемый процесс остановлен из-за отправки сигнала.
  • если сигнал SIGTRAP , убедитесь, что это не какой-то особый случай, например PTRACE_EVENT _ * и т. Д.
  • проверить, не было ли это вызвано остановкой на одном шаге или hw (либо путем проверки DR_STATUS для DR_SINGLESTEP / DR_TRAPx , либо проверки si.code siginfo для TRAP_TRACE / TRAP_HWBKPT )
  • и если это было NOT одиночный шаг или точка останова, предположите, что этот сигнал должен быть доставлен в отслеживаемый процесс.

И это работает, пока отслеживаемая программа не использует syscallво время одиночного шага.Когда это происходит, SIGTRAP должен быть доставлен, и проверка точки останова singlestep / hw дает ответ, что это ни то, ни другое, поэтому SIGTRAP доставляется.И это неправильно, потому что сам отслеженный процесс не делает ничего, что должно привести к SIGTRAP, поэтому этот не должен быть доставлен.

То, что я проверил сейчас:- Это не происходит, когда процесс не отслеживается (конечно)- Это не происходит, когда процесс отслеживается, но не пошагово- Когда это происходит, DR_TRAPx и DR_SINGLESTEP не установлены- Когда это происходит, si.code siginfo == TRAP_BKPT (не TRAP_HWBKPT, как для точки останова dr)- Это происходит, когда 32-разрядное приложение отслеживается 32-разрядным средством трассировки, 32-разрядное приложение отслеживается 64-разрядным приложением и 64-разрядное приложение отслеживается 64-разрядным средством трассировки

Мой вопрос: почему я получаю этот SIGTRAP? (и откуда это исходит точно / может ли TRAP_BKPT произойти в другом случае?)

...