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


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


ASSERT ( sizeof ( BYTE) == dwReadWrite);

if ( ( FALSE == bWriteMem ) ||

( sizeof ( BYTE) != dwReadWrite)) 

{

return ( FALSE); 

}

 // Вернуть защиту к состоянию, которое предшествовало

// установке точки прерывания

// Change the protection back to what it was before

// I blasted thebreakpoint in.

VERIFY ( DBG_VirtualProtectEx ( dp->hProcess ,

mbi. BaseAddress, 

mbi.RegionSize ,

 mbi.Protect , 

SdwOldProtect ));

// Сбросить кэш инструкций в случае, если эта память была в кэше CPU

 bFlush = DBG_FlushInstructionCache ( dp->hProcess ,

(LPCVOID)ulAddr, 

sizeof ( BYTE) );

 ASSERT ( TRUE = bFlush);

 return ( TRUE);

 }

После установки точки прерывания CPU выполнит ее и сообщит отладчику, что произошло исключение EXCEPTION_BREAKPOINT (0x80000003) — здесь-то и появляется проблема. Если это регулярная точка прерывания, то отладчик определит место ее размещения и покажет его пользователю. После того как пользователь решает .продолжить выполнение, отладчик должен проделать некоторую работу, чтобы восстановить состояние программы. Точка прерывания переписала часть памяти, поэтому если вы, как автор отладчика, просто позволите процессу продолжаться, то выполните неправильную кодовую последовательность, и подчиненный отладчик, вероятно, завершится аварийно. Поэтому следует передвинуть указатель текущей инструкции назад, к адресу точки прерывания и заменить ее кодом операции, который был сохранен при установке этой точки. После восстановления кода операции можно продолжать выполнение.

Вопрос: как переустанавливать точку прерывания, чтобы иметь возможность повторно останавливаться в этом месте? Если CPU поддерживает пошаговое выполнение, переустановка точки прерывания тривиальна. В пошаговом режиме CPU выполняет единственную инструкцию и генерирует другой тип исключения — EXCEPTION_SINGLE_STEP (0x80000004). К счастью, все CPU, на которых выполняются 32-разрядные Windows, поддерживают пошаговое выполнение.


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



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