Посмотреть местоположение памяти/установить «точку останова данных» из кода?

StackOverflow https://stackoverflow.com/questions/1689019

Вопрос

У нас проблема с перезаписью памяти.В какой-то момент во время работы нашей программы ячейка памяти перезаписывается, что приводит к сбою нашей программы.проблема возникает только в режиме выпуска.в режиме отладки все хорошо.это классическая ошибка C/C++, которую очень сложно обнаружить.

Мне было интересно, есть ли способ добавить некоторый «код отладки», который будет следить за этой ячейкой памяти и вызывать обратный вызов после ее изменения.По сути, это то, что отладчик может делать в режиме отладки («точка останова данных»), но нам нужно что-то подобное в релизе.

Это было полезно?

Решение

Если вы можете контролировать расположение переменной, вы можете выделить ее на выделенной странице и установить разрешения страницы, чтобы разрешить только чтение, используя ВиртуальнаяЗащита (в Windows...не уверен, что это Linux).

Таким образом, вы получите нарушение прав доступа, когда кто-то попытается написать на него запись.С помощью функции переводчика исключений вы можете рассматривать это как обратный вызов.

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

Другие советы

Вы по-прежнему можете генерировать символы отладки для «релизной» части кода.Это по-прежнему можно запустить через отладчик, как и в режиме «отладки».

Недавно я сделал нечто подобное с одним из наших драйверов выпуска, чтобы мы могли запускать его через vtune.Для Microsfot LINK я добавил -DEBUG флаг, для Microsoft CC я добавил -Zi.Все работает нормально. ссылка на МСКБ

Вы можете найти это связь полезный.

Предполагая, что вы используете Windows, используйте Windbg для отладки вашей программы и проверьте команду ba - это сломается при доступе к памяти.

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

API отладки зависят от платформы, но они существуют. Окна и UNIX API можно найти в Интернете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top