Отладка приложений


Точки прерывания и пошаговый проход - часть 7


Я нахожу активный поток

//в конечном счете случайно.

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

}

 }

// Все потоки имеют установленные точки прерывания. Теперь будем

 // всех их рестартовать и отправлять каждому поточное сообщение.

 // Причина для отправки таких сообщений проста.


Начало  Назад  Вперед



Книжный магазин