Вам нужно запустить какой-нибудь инструмент стороннего производителя для вашего двоичного файла, например Quantify (IBM) или Callgrind (или как @Paul R, упомянутый выше, gprof). Они сгенерируют дерево вызовов, которое предоставит вам необходимую информацию, например, google: "дерево вызовов C с функциями", которое откроет множество полезностей, которые вы можете связать со своим кодом ...
Если вы хотите свернуть свои собственные, вам нужно добавить одну строку в начало каждой из ваших функций, которая создает объект, выделенный в стеке, и вы можете поймать последовательность ctor / dtor, чтобы знать, когда вы ввели и вышел из функции, а затем сохранил их «стек» для генерации собственного дерева вызовов ... довольно легко сделать (в однопоточном, сложном в многопоточном) ...