C не поддерживает какую-либо форму самоанализа или выполнения каких-либо действий автоматически с помощью магии во время выполнения или на виртуальной машине; виртуальной машины нет, а поддержка времени выполнения - это, в основном, библиотеки «мертвого» кода, обеспечивающие стандартную функциональность.
И, как указал Субтво, если вы хотите что-то сделать (например, войти / выйти из журнала), это нужно будет сделать, и, следовательно, потребуется время. Вы не можете просто «спрятать» этот штраф, очень мало накладных расходов, чтобы его ввести.
Стандартный профилировщик может дать вам некоторое представление о статистической выборке вашей программы, чтобы увидеть, какие функции выполняются, но это не даст вам порядок вызовов, а только случайные места, в которых ваша программа выполняла код во время выборки.
Возможно, вы могли бы обратиться к некоторой хитрости препроцессора, это распространенный способ выполнения «шаблонных» вещей, таких как ведение журнала, например, путем определения некоторых макросов, которые вы затем помещаете в точки входа / выхода каждой функции. Тем не менее, вы должны помнить, включая макросы, и любое снижение производительности при ведении журнала, конечно, будет присутствовать.