Автоматический разрыв, когда содержимое ячейки памяти изменяется или читается - PullRequest
14 голосов
/ 11 августа 2009

Старый отладчик DEC Tru64 UNIX имел функцию (называемую «контрольными точками для наблюдения за переменными»), которая отслеживала область памяти (или диапазон адресов) для операций чтения или записи, а при обнаружении такой активности программа прерывалась, поэтому мог бы расследовать почему. Подробности смотрите:

http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V50_HTML/ARH9QATE/DOCU_009.HTM

Есть ли способ сделать что-то подобное в отладчике VisualStudio? Или есть дополнение или какой-нибудь другой инструмент, который может сделать это под Windows?

Ответы [ 5 ]

22 голосов
/ 11 августа 2009

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

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

6 голосов
/ 11 августа 2009

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 );
1 голос
/ 12 августа 2009

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

0 голосов
/ 26 января 2017

Я рекомендую проект hwbreak . Он даже позволяет устанавливать точку останова при чтении местоположения.

Я изменил его, чтобы создать только один поток и повторно использовать этот поток для всех точек останова данных, но это было только для эффективности.

0 голосов
/ 11 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...