Чтобы решить эту проблему, я переопределил операторы malloc / new & free / delete , чтобы они как можно больше отслеживали структуру данных об операции Вы выполняете.
Например, при переопределении malloc / new , вы можете создать запись адреса вызывающего абонента, количества запрошенных байтов, возвращенного назначенного значения указателя и идентификатора последовательности, чтобы все ваши записи могли быть упорядочены (Я не знаю, имеете ли вы дело с темами, но вам также нужно это учитывать).
При записи подпрограмм free / delete я также отслеживаю адрес вызывающего абонента и информацию об указателе. Затем я оглядываюсь назад в список и пытаюсь сопоставить копию malloc / new , используя указатель в качестве моего ключа. Если я не найду его, поднимите красный флаг.
Если вы можете себе это позволить, вы можете встраивать в свои данные идентификатор последовательности, чтобы быть абсолютно уверенным, кому и когда был сделан вызов распределения. Ключевым моментом здесь является уникальная идентификация каждой пары транзакций как можно больше.
Тогда у вас будет третья подпрограмма, отображающая историю распределения / освобождения памяти вместе с функциями, вызывающими каждую транзакцию. (это может быть достигнуто путем анализа символической карты из вашего компоновщика). Вы будете знать, сколько памяти вы выделите в любое время и кто это сделал.
Если у вас недостаточно ресурсов для выполнения этих транзакций (мой типичный случай для 8-разрядных микроконтроллеров), вы можете вывести ту же информацию через последовательный канал или канал TCP на другой компьютер с достаточным количеством ресурсов.