Кучи коррупции: что может быть причиной? - PullRequest
18 голосов
/ 01 октября 2009

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

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

Буду признателен, если вы предложите сценарии, которые могут привести к повреждению кучи.

Платформа: Windows XP

Язык: C ++

Компилятор: VC6

Ответы [ 13 ]

1 голос
/ 01 октября 2009

Если у вас есть доступ к * nix-машине, вы можете использовать Valgrind.

0 голосов
/ 04 августа 2017

Это синтаксис функции HeapAlloc.

LPVOID WINAPI HeapAlloc(
  _In_ HANDLE hHeap,
  _In_ DWORD  dwFlags,
  _In_ SIZE_T dwBytes
);

Здесь dwFlags paramater может иметь либо HEAP_GENERATE_EXCEPTIONS, либо HEAP_NO_SERIALIZE, либо HEAP_ZERO_MEMORY.

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

"Установка значения HEAP_NO_SERIALIZE устраняет взаимное исключение в куче. Без сериализации, два или более потоков, которые используют один и тот же дескриптор кучи, могут пытаться выделить или освободить память одновременно, вероятно, вызывает коррупцию в куче. "

поэтому я думаю, что из-за повреждения памяти в куче произошел сбой узла.

0 голосов
/ 18 октября 2013

Вы думали изолировать источник коррупции с помощью gflags? Получив дамп (или отлаживающий отладчик -> WinDBG), вы сможете более точно увидеть, где происходит повреждение.

Вот несколько примеров gflag: http://blogs.msdn.com/b/webdav_101/archive/2010/06/22/detecting-heap-corruption-using-gflags-and-dumps.aspx

Ура, Seb

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