Я столкнулся со странным сбоем в нашем программном обеспечении, и у меня много проблем с его отладкой, и поэтому я ищу совет SO, как его решить.
Авария - это нарушение прав доступа при чтении указателя NULL:
Исключение первого шанса при $ 00CF0041.Класс исключения $ C0000005 с сообщением «нарушение прав доступа по адресу 0x00cf0041: чтение адреса 0x00000000».
Это происходит только «иногда» - мне пока не удалось выяснить какие-либо рифмы или причиныкогда - и только в основной теме.Когда это происходит, стек вызовов содержит одну неправильную запись:
Для основного потока, которым это является, он должен показывать большой стек, полный других элементов.
На данный момент все остальные потоки неактивны (в основном это WaitForSingleObject
или аналогичная функция). Я видел только этот сбой в основном потоке.Он всегда имеет один и тот же стек вызовов одной записи, в одном и том же методе по одному и тому же адресу.Этот метод может или не может быть связан - мы используем VCL в нашем приложении.Моя ставка, тем не менее, заключается в том, что что-то (возможно, довольно давно) повреждает стек, а адрес, где он падает, фактически случайный.Обратите внимание, что это был один и тот же адрес в нескольких сборках, хотя, вероятно, он не совсем случайный.
Вот что я пробовал:
- Попытка надежно воспроизвести его на определенном уровне.точка.Я не нашел ничего, что воспроизводит это каждый раз, и пару вещей, которые иногда делают, или нет, без видимой причины.Это не достаточно узкие действия, чтобы сузить его до определенного раздела кода.Это может быть связано со временем, но в тот момент, когда интегрируется IDE, другие потоки обычно ничего не делают.Я не могу исключить проблему с многопоточностью, но думаю, что это маловероятно.
- Сборка с дополнительными операторами отладки (дополнительная информация об отладке, дополнительные утверждения и т. Д.) После этого сбоя никогда не происходит.
- Здание с Codeguard включена.После этого сбой никогда не происходит, и Codeguard не показывает ошибок.
Мои вопросы:
1.Как мне найти какой код вызвал сбой?Как мне сделать то же самое, что вернуться обратно в стек?
2.Какой у вас общий совет, как отследить причину этого сбоя?
Я использую Embarcadero RAD Studio 2010 (проект в основном содержит код C ++ Builder и небольшие объемыDelphi.)
Редактировать: Я подумал, что должен добавить, что на самом деле вызвало это.Был поток, который вызывал ReadDirectoryChangesW
, а затем, используя GetOverlappedResult
, ждал события, чтобы продолжить и что-то сделать с изменениями.Событие также было сигнализировано для завершения потока после установки флага состояния.Проблема была в том, что при выходе из потока он никогда не вызывал CancelIO
.В результате Windows все еще отслеживала изменения и, вероятно, все еще записывала в буфер при изменении каталога, даже если буфер, перекрывающаяся структура и событие больше не существовали (равно как и контекст потока, в котором они были созданы). Когда CancelIO
был вызван, больше не было сбоев.