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


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


// подчиненного отладчика и установить указатель текущей инструкции

// для каждого из них на точку прерывания. Таким образом, я могу

// гарантировать, что по крайней мере один из потоков будет

// отлавливать одноразовые точки прерывания. Одна из ситуаций,

// при которой установка точки прерывания на каждом потоке не будет

// работать, происходит, когда приложение "висит". Поскольку в

// обороте нет потоков, точки прерывания никогда не вызываются.

// Чтобы выполнить работу в такой тупиковой ситуации, я был вынужден

// использовать следующий алгоритм:'

// 1. Установить точки прерывания с помощью данной функции.

// 2. Установить флажок состояния, указывающий, что я ожидаю

// на точке прерывания Debug Break.

// 3. Установить фоновый таймер на ожидание точки прерывания.

// 4. Если одна из точек прерывания исчезает, сбросить таймер.

// Все хорошо!

// 5. Если таймер сбрасывается, то приложение "висит".

// 6. После таймера установить указатель инструкции одного из

// потоков на другой адрес и поместить точку прерывания по этому

// адресу.

// 7. Рестартовать поток.

// 8. Когда эти специальные точки прерывания сработают, очистить

// точку прерывания и переустановить указатель команды

// обратно в первоначальное положение.

// Повысим приоритет этого потока так,

// чтобы пройти через установку этих точек прерывания как можно

// быстрее и предохранить любой поток подчиненного отладчика от

// планирования.

HANDLE hThisThread = GetCurrentThread () ;

 int iOldPriority = GetThreadPriority ( hThisThread); 

SetThreadPriority ( hThisThread, THREAD_BASE_PRIORITY_LOWRT);

 HANDLE hProc = GetDebuggeeProcessHandle ();

 DBGTHREADVECT::iterator i; for ( i = m_vDbgThreads.begin ();

 i != m_vDbgThreads.end () ;

 i++ ) 

{

// Приостановить этот поток. Если он уже имеет счетчик

// приостановок, меня это, на самом деле, не беспокоит. Именно

// поэтому точки прерывания и устанавливались на каждом потоке

// подчиненного отладчика.


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



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