2009-08-11 2 views
12

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

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

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

ответ

19

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

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

+2

Это то, что я искал, спасибо! – 2009-08-11 22:43:31

+0

Этот пункт меню включен, только когда активен отладчик. Некоторое время я думал, что он был отключен в Экспрессе. – Artfunkel

0

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

6

Visual Studio allows to set точки останова на карте памяти всего 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); 
+0

Это излишество для того, что я искал, но я отпишу его за какой-то неудачный день, когда у меня есть очень неприятная проблема. – 2009-08-11 22:48:07

+0

Это потрясающе для работы с пределом 4 предела разрыва – paulm

1

Вы можете использовать Windbg и установить ба останова на нужный адрес

0

рекомендую the hwbreak project. Это даже позволяет устанавливать точку останова данных при чтении местоположения.

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

Смежные вопросы