У меня есть ошибка повреждения кучи для приложения, поэтому я включил кучу страниц из gflags и собрал файл дампа сбоев для этого приложения.Куча памяти с удвоением свободной памяти
Из файла дампа я узнал, что он должен удвоить объем памяти.
Вот пример, из стека вызовов я нашел этот
msvcr100!free(void * pBlock = "**Address**")
Тогда я сделал это
!heap -p -a <address>
address found in
_HEAP @
HEAP_ENTRY Size Prev Flags UserPtr UserSize - state
Address 000a 0000 [02] address 00003 - **(free)**
Trace: <1>
<2>
<3>
Таким образом, мы видим, что он пытается удвоить освободить память, и что привело к в аварии. Мой вопрос: можем ли мы увидеть стек вызовов, который изменил или освободил эту память до этой операции? Является ли это возможным?
Я вижу след под командой heap -p -a, это тот, который освободил память? Если это так, я вижу только некоторую часть стека вызовов. Есть ли способ увидеть общий стек вызовов или пройти через стек вызовов вручную, чтобы увидеть, какая операция освободила этот блок памяти.
Вы просите машины времени, файл дампа не один. –
Да, я знаю, что дамп-файл является моментальным снимком в этот момент времени, но просто любопытно, если включение полной кучи страниц может дать немного больше информации, чем тот, кто пытается освободить память, например, кто уже освободил память? – user2800803
Вероятно, вы должны включить кучу страниц, чтобы начать работу - использовать кусочки бит для использования памяти, чтобы отметить память, так что повреждение (как двойное использование) легче поймать. Кроме того, эта ссылка должна быть полезна: http://code.msdn.microsoft.com/windowsdesktop/CppHeapCorruption-7a727b6a – deemok