Автоматическое повреждение, когда содержание ячейки памяти изменяется или читается

Если оптимизатор говорит, что они - то же, тогда рассматривают человеческий фактор. Я предпочитаю видеть НЕ, СУЩЕСТВУЕТ:)

15
задан 11 August 2009 в 15:40
поделиться

4 ответа

Да, вы можете сделать это в Visual Studio. Вы можете создать «Новую точку останова по данным» в меню отладки, пока вы не работаете в работающей программе. Затем вы указываете адрес для наблюдения и количество байтов.

Это работает только для изменения значения. Я не знаю, как смотреть на доступ для чтения. Однако очень часто возникает вопрос, где было изменено значение. Я обнаружил, что не хочу знать, кто так часто читает значение.

23
ответ дан 1 December 2019 в 02:10
поделиться

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 );
6
ответ дан 1 December 2019 в 02:10
поделиться

Вы можете использовать WINDBG и установить ba точка останова на желаемом адресе

1
ответ дан 1 December 2019 в 02:10
поделиться

Да, точки останова данных могут обнаруживать записи. Однако не знаю, можно ли проверить чтение. Я не верю, что x86 имеет встроенную поддержку для этого.

0
ответ дан 1 December 2019 в 02:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: