Visual Studio позволяет установить точек останова в ячейке памяти длиной всего 4 байта (в 32-разрядной версии Windows). Чтобы перехватить доступ к памяти (чтение или запись), вы можете использовать следующий класс:
struct protect_mem_t {
protect_mem_t( void* addr, size_t size ) : addr(addr), size(size), is_protected(FALSE) {
protect();
}
~protect_mem_t() { release(); }
BOOL protect() {
if ( !is_protected ) {
// To catch only read access you should change PAGE_NOACCESS to PAGE_READONLY
is_protected = VirtualProtect( addr, size, PAGE_NOACCESS, &old_protect );
}
return is_protected;
}
BOOL release() {
if ( is_protected )
is_protected = !VirtualProtect( addr, size, old_protect, &old_protect );
return !is_protected;
}
protected:
void* addr;
size_t size;
BOOL is_protected;
DWORD old_protect;
};
Изменяет режим доступа на выбранных страницах памяти. Размер страницы равен 4096 байтам в 32-битных системах. Исключение будет брошено на каждый доступ к защищенной памяти. Этот класс ограничен в использовании только большими областями памяти, но я надеюсь, что он может быть полезным.
Может использоваться следующим образом:
// some_array should be aligned on PAGE_SIZE boundaries
protect_mem_t guard( &some_array, PAGE_SIZE );