После вызова DebugBreakProcess () - что представляет собой событие dwThreadId? - PullRequest
0 голосов
/ 02 декабря 2011

Допустим, какой-то процесс отлаживает другой процесс (вызывая DebugActiveProcess ()).

Затем какой-то другой процесс / поток генерирует исключения точек останова в этом отлаженном процессе (вызывая DebugBreakProcess ()). Затем отладчик получает это событие EXCEPTION_DEBUG_EVENT-> EXCEPTION_BREAKPOINT, а в структуре DEBUG_EVENT поле dwThreadId будет содержать некоторый идентификатор.

Мой основной вопрос - что означает dwThreadId ? (MSDN говорит, что это «Идентификатор потока, в котором произошло событие отладки»).

Мои опасения заключаются в следующем:


  1. Что означает «в котором произошло событие отладки»? Разве не все потоки процесса каким-то образом сигнализируются таким образом и процесс полностью блокируется?

  2. Более того, из того, что я прочитал, этот механизм работает примерно так:

    API DebugBreakProcess () работает , создавая поток в целевом процессе, который вызывает инструкцию точки останова, которая заставляет обычный механизм SEH вступать во владение.

    Это означает, что есть вероятность, что этот dwThreadId на самом деле является идентификатором этого вновь созданного потока, а не идентификатором какого-либо из потоков исходного процесса. Я прав?

  3. Что, если отлаженный процесс является многопоточным (на самом деле это почти наверняка так)? Это идентификатор потока, который находился «в процессоре» в момент вызова API DebugBreakProcess ()?

ОБНОВЛЕНИЕ: ответ на весь этот блок. Смотрите первый ответ.


  1. Как насчет случая двухъядерной системы и двух потоков одного и того же процесса в настоящее время работают параллельно? Кто из них победит и будет указан в этом удостоверении личности? Или, может быть, это вызовет два разных исключения EXCEPTION_BREAKPOINT?

Большое спасибо за любую помощь.

1 Ответ

0 голосов
/ 02 декабря 2011

Вы в значительной степени ответили на свой вопрос, это будет тема с именем DebugBreak(), которая, в свою очередь, является новой темой, созданной DebugBreakProcess().

...