C ++ кучи коррупции - PullRequest
       14

C ++ кучи коррупции

8 голосов
/ 12 апреля 2011

Я давно не делал C ++, но решил закончить большой проект, над которым я работал для кого-то.Сейчас я получаю следующее сообщение об ошибке ...

ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после нормального блока (# 1761) в 0x17DEB940.CRT Обнаружено, что приложение записывает в память после завершения буфера кучи.

Я перебираю все функции, которые, как я думал, могли вызвать его, но я в растерянности.Есть ли способ использовать более продвинутые функции отладки, чтобы выследить это?

Ответы [ 4 ]

4 голосов
/ 12 апреля 2011

Звучит как классическая ошибка повреждения памяти.Платформа будет полезной информацией.Не видя ваш код и его сложность, есть несколько возможностей:

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

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

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

Дэвид

2 голосов
/ 12 апреля 2011

В Linux я бы порекомендовал valgrind в качестве инструмента, который точно скажет вам, что пошло не так.Вы можете посмотреть некоторые альтернативы для Windows здесь .

1 голос
/ 12 апреля 2011

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

Отслеживание этих ошибок может быть непростым делом, однако для получения подробной информации обратитесь к книге Advanced Windows Debugging , в которой есть целая глава, посвященная этой теме.

1 голос
/ 12 апреля 2011

Попробуйте поймать его с помощью Intruments.

Звучит как классическая ошибка C.Вы уверены, что не пишете вне массива c (например, int [xyz]) в цикле while или for?Это не вызывает каких-либо ошибок, но вы получаете странные эффекты во многих местах, которые не имеют ничего общего с той частью, где находится ошибка.: p

...