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


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


Если подчиненный

 // отладчик прореагирует на сообщения или другую обработку, он будет 

// немедленно прерван. Однако, если он просто простаивает в цикле

 // сообщений, необходимо вынудить его к действию.

// Поскольку имеется идентификатор (ID) потока, будем просто посылать 

// потоку сообщение WM_NULL. Предполагается, что это простенькое

 // сообщение, так что оно не должно испортить подчиненный отладчик. 

// Если поток не имеет очереди сообщений, эта функция просто потерпит

 // неудачу для такого потока, не причинив никакого вреда,

 for ( i = m_vDbgThreads.begin () ;

 i!= m_vDbgThreads.end () ;

 i++ ) 

// Пусть этот поток продолжит выполнение

 //до очередной точки прерывания

. DBG_ResumeThread ( i->ro_hThread);

 PostThreadMessage ( i->m_dwTID, WM_NULL, 0, 0); 

}

// Теперь понизить приоритет до старого значения. 

SetThreadPriority ( hThisThread, iOldPriority); 

}

Для того чтобы остановить подчиненный отладчик, нужно умудриться "втиснуть" точку прерывания в поток команд CPU так, чтобы можно было останавливаться в отладчике. Если поток выполняется, то подобраться к известной точке можно при помощи API-функции suspendThread, приостанавливающей его. Затем, вызвав API-функцию GetThreadContext, определить указатель текущей команды. Имея такой указатель, можно вернуться к установке простых точек прерывания. Установив точку прерывания, нужно вызвать API-функцию ResumeThread, чтобы разрешить потоку продолжать выполнение и сделать так, чтобы он натолкнулся на эту точку.

Хотя вмешаться в отладчик довольно просто, нужно подумать еще о паре проблем. Первая состоит в том, что ваша точка прерывания может не сработать. Если подчиненный отладчик обрабатывает сообщение или делает некоторую другую работу, он будет прерван. Однако, если подчиненный отладчик, находясь в таком состоянии, ожидает прибытия сообщения, точка прерывания не будет срабатывать, пока подчиненный отладчик не получит сообщение.


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



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