#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
.