Я недавно исправил дефект в нашем продукте, симптомом которого было нарушение доступа, вызванное доступом к висячему указателю.
Для хорошей практики я добавил модульный тест, чтобы убедиться, что ошибка не возникаетназад.При написании модульного теста я всегда отменяю свое исправление дефекта и проверяю, что модульный тест не прошел, иначе я знаю, что он не выполняет свою работу должным образом.
После возврата исправления дефекта я обнаружил, что мой модультест еще проходит (не хорошо).Когда я подключил к модульному тесту отладчик, чтобы увидеть, почему он проходит, тест не прошел (т. Е. Было сгенерировано исключение), и я смог сломать и заметить, что стек вызовов совпадает с тем, что было в исходном дефекте, который я исправил.1006 * Я не изменял параметры «Сбой при исключении» в Visual Studio 2005, и это действительно критическое исключение Win32, которое приводит к прекращению использования тестового набора (т. Е. Отсутствует обработчик изящных исключений).
Текст исключения:
Unhandled exception at 0x0040fc59 in _testcase.exe: 0xC0000005:
Access violation reading location 0xcdcdcdcd.
Примечание: Местоположение не всегда 0xcdcdcdcd
( выделено, но неписаная память кучи Win32 ).Иногда это 0x00000000
, а иногда это другой адрес.
Это похоже на обратную сторону традиционного гейзенбаг, где проблема исчезает при наблюдении через отладчик.В моем случае наблюдение за ним через отладчик приводит к появлению проблемы!
Первоначально я думал, что это состояние гонки, обусловленное временными различиями в отладчике.Однако, когда я добавил трассировку в код и запустил его отдельно от отладчика, данные, которые я печатаю, указывают мне, что приложение должно прерываться аналогично тому, как при работе в отладчике.Но это не так!
Есть ли какие-либо предложения относительно того, что может быть причиной этого?
Обновление: Я сужаю причину этой проблемы.См. этот вопрос для более подробной информации.Обновлю этот вопрос ответом, если найду его.