Обычно считается, что выделять память после стартового инита приложения -- неправильно, ибо менеджер кучи обладает непредсказуемым временем ответа в общем случае из-за фрагментации, хотя возможны хитрые варианты.
Но если архитектура памяти стека не настраиваема сразу на старте, можно предложить универсальную динамическую схему экспериментального этапа -- периодически запускать нить с максимальным приоритетом, которая будет выгребать у ОС всю возможную память дихотомией размеров и сразу же возвращать, выведя нужные данные в лог.
Для конкретной ОС можно в map-файле подглядеть не свои глобальные переменные -- вполне вероятно, что учёт уже ведётся, и осталось его только вывести наружу.
Также обычно компиляторы поддерживают "перегрузку" любой системной функции -- "повесив" свои версии malloc()/free()/calloc(), мы получим proxy, через которое все станут работать. Только вот надо ещё суметь вызвать прежние версии...