Устройство кучи в Win32 (HeapAlloc/HeapFree)
От: alex_e Россия нет
Дата: 16.07.02 16:43
Оценка:
Начну издалека.
Скажем, устройство DCRT кучи известно. Есть структура _CrtMemBlockHeader, которая предшествует блоку, выделенному через new/malloc/calloc. Таким образом в отладчике легко проверить любой указатель на валидность (посмотреть на его заголовок и побегать по списку выделенных блоков).

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

А как устроены кучи Win32? Какие заголовки предшествуют блокам выделенной памяти? Это кому-нибудь известно? (У Рихтера ничего нет...)

А проблема такая. Приложение упало на RtlFreeHeap(). По дампу процесса установлено, что указатель передан в HeapFree() корректный. В смысле, что по нему находятся именно те данные, которые там и должны находиться. Нет сомнений, что указатель получен через HeapAlloc(). Интересно было бы проверить корректность заголовка этого указателя, либо как-то еще проверить его.

Буду очень благодарен за любую информацию по такой специфичной проблеме.
Re: Устройство кучи в Win32 (HeapAlloc/HeapFree)
От: ua1zcl Россия www.alexklm.ru
Дата: 16.07.02 19:45
Оценка:
Здравствуйте alex_e, Вы писали:

AE>Интересно было бы проверить корректность заголовка этого указателя, либо как-то еще проверить его.


Похожая проблема у меня была. Оказалось что в выделенном блоке памяти посрредством new затирался служебный DWORD, находящийся до начала выделяемого блока. Затирался по моей вине, был выход за массив на 1 байт. Правда, это было в Борланде 5.02., ошибку искал долго.
Александр
Re: Устройство кучи в Win32 (HeapAlloc/HeapFree)
От: Oleg_M  
Дата: 17.07.02 05:24
Оценка:
Здравствуйте alex_e, Вы писали:

AE> Интересно было бы проверить корректность заголовка этого указателя, либо как-то еще проверить его.


Попробуй непосредственно перед RtlFreeHeap проверить "исправность" кучи в целом:

if(_heapchk() !=_HEAPOK)
{ // Ой, беда....
}

Я знаю только эту "проверку правильности", если она выдает ошибку, просто двигаю этот if выше по коду, выясняя,
какая операция вызвала поломку кучи.
Re: Устройство кучи в Win32 (HeapAlloc/HeapFree)
От: Аноним  
Дата: 17.07.02 05:26
Оценка:
Здравствуйте alex_e, Вы писали:

AE>А проблема такая. Приложение упало на RtlFreeHeap(). По дампу процесса установлено, что указатель передан в


У меня обычная ошибка — повторый вызов RtlFreeHeap для того же указателя.
Re[2]: Устройство кучи в Win32 (HeapAlloc/HeapFree)
От: Алекс Россия http://wise-orm.com
Дата: 17.07.02 06:32
Оценка:
Здравствуйте Oleg_M, Вы писали:

OM>Здравствуйте alex_e, Вы писали:


AE>> Интересно было бы проверить корректность заголовка этого указателя, либо как-то еще проверить его.


OM>Попробуй непосредственно перед RtlFreeHeap проверить "исправность" кучи в целом:


OM>if(_heapchk() !=_HEAPOK)

OM>{ // Ой, беда....
OM>}

OM>Я знаю только эту "проверку правильности", если она выдает ошибку, просто двигаю этот if выше по коду, выясняя,

OM>какая операция вызвала поломку кучи.

А если ты использовал свою кучу (пользовал HeapCreate()), то проверяй HeapValidate()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.