//в конечном счете случайно.
DBG_SuspendThread ( i->m_hThread);
// Поток приостановлен, можно получить контекст.
CONTEXT ctx;
ctx.ContextFlags = CONTEXT_FULL;
// Поскольку, если используется ASSERT, приоритет этого потока
// установлен в реальном масштабе времени, и компьютер может
// "висеть" на панели сообщения, поэтому в if-операторе можно
// указать ошибку только с помощью оператора трассировки.
if ( FALSE != DBG_GetThreadContext ( i->m_hThread, &ctx))
{
// Найти адрес, который указатель команд собирается
// выполнить. Это адрес, где будет устанавливаться
// точка прерывания.
DWORD dwAddr = ReturnlnstructionPointer ( &ctx);
COneShotBP cBP;
// Установить точку прерывания.
cBP.SetBreakpointLocation ( dwAddr);
// Активизировать ее.
if ( TRUE == cBP.ArmBreakpoint ( hProc))
{
// Добавить эту точку прерывания к списку Debug Break,
// только если точка прерывания была успешно
// активизирована. Подчиненный отладчик легко мог бы
// иметь множественные потоки, связанные с одной и той же
// командой, но я хочу установить на этот адрес
// только одну точку прерывания. m_aDebugBreakBPs.Add ( cBP);
}
}
else
{
TRACE ( "GetThreadContext failed! Last Error = Ox%08X\n",
GetLastError ());
#ifdef _DEBUG
// Поскольку функция GetThreadContext потерпела неудачу,
// вероятно, следует посмотреть, что случилось. Поэтому
// войдем в отладчик, выполняющий отладку отладчика WDBG.
// Даже притом, что поток WDBG выполняется на уровне
// приоритетов реального масштаба времени, вызов DebugBreak
// немедленно удаляет этот поток из планировщика операционной
// системы, поэтому его приоритет снижается. DebugBreak ();
#endif
}
}
// Все потоки имеют установленные точки прерывания. Теперь будем
// всех их рестартовать и отправлять каждому поточное сообщение.
// Причина для отправки таких сообщений проста.