Народ! Получаю данный эксепшен. Из того, что нагуглил проблема связана с HEAP CORRUPTION.
Обычно при HEAP CORRUPTION выдается минимальная диагностика, блок рядом с которым произошла ошибка и тп. В данном случае ничего не выдается. Что значит эта ошибка? Error lookup не знает такой ошибки. В гугле тоже не нашел
Добавление _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF
| _CRTDBG_DELAY_FREE_MEM_DF | _CRTDBG_CHECK_CRT_DF );
Скрывает проблему
Проблема кроссплатформенная, на линуксе она тоже воспроизводится как Segmentation Fault, но пока не пробовал дебажить под линуксом (мне под виндой удобнее). Я понимаю, что мы где-то лазим по памяти, но удивляет отсутсвие диагностики. Развалы происходят в 100% запусков, в разных тредах, но всего пяток коллстеков с развалом. любое изменение кода в функциях из колстеков приводит к изменению комбинации коллстеков развала (что в общем понятно, что по памяти ходит другой тред).
Развал происходит при вызове:
_CrtMemBlockHeader* const header{static_cast<_CrtMemBlockHeader*>(HeapAlloc(__acrt_heap, 0, block_size))};
Самое удивительное, но развал происходит когда block_size = 56. других значений не видел, непонятно почему ???
Те задача стоит в том чтобы понять где поврежден хип?
Здравствуйте, watchmaker, Вы писали:
G6>>понять где поврежден хип?
W>A AddressSanitizer что говорит?
Показал багу!
Спасибо огромное!!!
ЗЫ. Мы работаем по VS2017 пока.
Здравствуйте, Kernan, Вы писали:
K>Ты бы сказал в чём была проблема что ли.
Да проблема стандартная, копи-пасте называется
Ну, а детали следующие:
Вызывается
void* ptr = malloc( 0 )
ptr — имеет реальное и валидное значение, а потом
memcpy( ptr, src, от 300 до 1500 байт )
Я так понимаю malloc с размером 0 хендлится несколько иначе, чем с реальным размером. И этот блок памяти с нулевым размером лежит в особом месте хипа, поэтому всякие защитные бордеры не сработали, и затирали мы походу важный кусок памяти.