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

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

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


person Lior    schedule 06.11.2009    source источник
comment
это для Windows, хотя наш проект кроссплатформенный. он падает в Windows (у которой есть несколько разных модулей, так что, видимо, дело в них). В любом случае всем большое спасибо! мы попробуем   -  person Lior    schedule 10.11.2009


Ответы (5)


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

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

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

person Rob Walker    schedule 06.11.2009
comment
В Linux это будет mprotect(). (хотел тоже самое написать, но вы меня опередили) - person Aaron; 06.11.2009
comment
Это ваше лучшее предложение. Эффективные точки останова данных требуют аппаратной поддержки для наблюдения за диапазоном памяти - если аппаратное обеспечение не поддерживает это, отладчик должен выполнить одношаговое выполнение, а затем вручную проверить, не изменился ли диапазон памяти. - person R Samuel Klatchko; 06.11.2009

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

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

Вы можете найти эту ссылку полезной.

person Pod    schedule 06.11.2009

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

person jolyon    schedule 06.11.2009
comment
Используйте это в сочетании с символами отладки, которые я упомянул для достижения наилучших результатов;) - person Pod; 06.11.2009

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

person Tim    schedule 06.11.2009

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

person Max Lybbert    schedule 06.11.2009