Как отладить / исправить нарушение доступа (Heap Corruption) - PullRequest
2 голосов
/ 28 июня 2011

Мое приложение падает (повторяется) после перехода с VS2005 на VS2008 (win32).

Если я вхожу в отладчик, я получаю:

Access violation reading location 0x00000014

Во-первых, я вижу, что объект класса в строке сбоя имеет значение NULL _vptr. Но некоторые другие объекты того же класса имеют ненулевое _vprt:)

Во-вторых, если я изменю порядок объявлений объектов-членов, сбой переместится на другую строку.

Так что я полагаю, это проблема поврежденной кучи.

Вы согласны? если да, может ли быть проблема с количеством выделений в стеке, таким как "char buffer [8192]"?

Я попытался очистить, верификатор приложений без удачи. Мое приложение представляет собой плагин (DLL), живущий в проприетарном приложении. Я могу присоединиться только с помощью отладчика.

Заранее спасибо,

Пол

Ответы [ 3 ]

3 голосов
/ 28 июня 2011

Вы согласны? если да, может ли быть проблема с количеством выделений в стеке, например char buffer[8192]?

Да, повреждение кучи может быть вызвано массивом огромных размеров, выделенным для кучи (с использованием new или malloc). Если вы создаете массив большого размера в стеке, если соседняя память выделена другому объекту, программа перезапишет данные этого объекта, что приведет к сбоям. Так что оба могут быть опасными, но из-за разных проблем. Если вы говорите о массиве стека, то нет, это не может привести к повреждению кучи просто потому, что стек или куча (скорее свободное хранилище в C ++) - это два разных объекта памяти.

Повреждения кучи могут быть очень неприятными и их трудно диагностировать. И нет определенных шагов для решения такой проблемы, хотя есть ряд методов, которые можно попробовать отладить такие ошибки.

Отладка повреждения кучи в Visual C ++ с использованием средств Microsoft Debugging Tools для Windows является отличным источником, документирующим методы, специфичные для Visual C ++

1 голос
/ 30 июня 2011

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

1 голос
/ 28 июня 2011

Это определенно выглядит как повреждение кучи - в какой-то момент ваш код записывает нули на вершине объекта, и это убивает vptr.Причина, по которой это происходит после перехода с VS2005 на VS2008, возможно, в том, что компоновка кучи несколько изменилась.Ошибка, вероятно, была и в VS2005, но ее повреждение было незамеченным.

Использование упомянутых вами инструментов обычно решает такие проблемы.Какую неудачу вы испытали при их использовании?

Поскольку вы говорите, что ваше приложение неоднократно вылетает одинаково, вы можете добавить проверки в свой код.Постоянно проверяйте поврежденный объект (убедитесь, что его начало не было обнулено), и ломайте, когда вы наблюдаете повреждение.Глядя на активность между последней успешной проверкой и перерывом, вы могли бы сосредоточиться.Просто помните, что любое изменение в использовании кучи может скрыть проблему, а именно повредить другое место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...