api отладки win32: многопоточная отладка — установите текущий поток

#debugging #winapi #reverse-engineering #win32-process

Вопрос:

Я пишу небольшой трейсер, используя Api отладки Win32 (не dbgeng). Общий поток-это:

 DEBUG_EVENT event;
WaitForDebugEvent(amp;event);
...
ContinueDebugEvent(event.pid, event.tid,...)
 

Мой вопрос: Как я могу переключить отладчик на другой поток, отличный от того, который сообщил о текущем событии отладки (event.tid)?
Т. Е. Поток A сообщает о событии в WaitForDebugEvent, но я хочу продолжить поток B.

В документации ContinueDebugEvent по второму параметру говорится:

Идентификатор потока для продолжения потока. Комбинация идентификатора процесса и идентификатора потока должна идентифицировать поток, который ранее сообщал о событии отладки.

Поэтому я не могу передать идентификатор другого потока.

Я знаю, что это возможно, потому что вы можете сделать это в графическом интерфейсе Visual Studio, а также в windbg: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/-s—set-current-thread-

Комментарии:

1. это невозможно. когда событие отладки происходит в потоке — система замораживает все остальные потоки в процессе и отправляет событие отладки отладчику из потока. и дождитесь ответа отладчика. пока вы не ответите на событие отладки в потоке A — вы не сможете продолжить. pid/tid существуют, потому что несколько процессов могут быть подключены к одному объекту отладки

2. Но тогда как это делают windbg и visual studio?

3. они этого не делают. это невозможно

4. в собственной код, с резьбы (а) создайте тему (Б), который просто позвоните MessageBoxW(0,0,0,0) и после этого (вы можете вставить Sleep , чтобы дать время для отображения MessageBox с) вставить, например, *(int*)0=0; после получил необработанное исключение в .. в резьбу (a) — пожалуйста, переключитесь на нить (Б) — пусть все идет, показать MessageBox и описать вопрос — как вы делаете это в vs или программы WinDbg. если, конечно, вы сделаете это

5. Единственное решение, которое я могу придумать, — это вызвать SuspendThread все потоки, кроме того, который вы хотите отследить, дождаться следующего события отладки в этом потоке и вызвать ResumeThread их. Чтобы справиться с ситуацией, когда событие отладки не происходит в течение длительного времени, вы можете установить таймер и возобновить потоки при его запуске. Я бы также предложил повысить приоритет потока, который вы хотите выполнить, над значением всех других потоков в процессе SetThreadPriority .