Как показывает ваша вторая трассировка стека, ваше приложение разрушает кучу. Заголовок блока кучи перезаписывается, и, таким образом, происходит сбой в диспетчере кучи при объединении свободных блоков или при прохождении через свободный список (в первой трассировке стека).
Код, который вы определили и который в настоящее время освобождает память, может быть жертвой другого кода, переполняющего или переполняющего блок памяти.
Самый простой способ отладки такого рода сбоев - использовать справку по отладке из окон, через pageheap или appverifier, но в зависимости от приложения он может слишком сильно замедляться или увеличивать использование памяти, слишком высокое, чтобы его можно было использовать, что похоже дело в этом. Вы можете попробовать использовать легкую страничку, которая будет иметь меньшее влияние.
Вам необходимо определить, какая часть приложения переполнена. Один из способов сделать это - посмотреть информацию, содержащуюся в переполненном блоке. Если у вас происходит сбой в RtlpCoalesceFreeBlocks, я думаю, что я помню, что один из регистров (@esi) указывает на начало поврежденного блока (я не нахожусь в системе Windows на момент написания и не могу это проверить). Или, если у вас есть дамп, с помощью команды windbg! Heap -a сбросит всю память и отобразит поврежденные блоки (лучше войти в файл, так как полный список кучи может быть длинным). Если поврежденные блоки известны, их содержимое может помочь идентифицировать код.
Другой помощью может быть включение трассировки стека (с помощью gflags). Это может быть сделано в производстве, так как он легче, чем pageheap. Он добавит некоторую информацию в блоки кучи и может переместить сбой в другое место в вашем приложении, но трассировка стека поможет определить, какой код выделил блоки, которые переполняются.