Трассировка автоматического входа-выхода в C - PullRequest
1 голос
/ 11 марта 2009

Должен ли я добавлять записи входа и выхода во всех функциях C?

Если есть, то есть ли какие-либо возможные способы автоматического ввода и выхода функции (аналогично автоматическому входу / выходу с использованием аспектно-ориентированного программирования в Java)

Приложение, которое я пишу, критично ко времени, и добавление операторов входа / выхода для каждой функции может снизить производительность, а также сделать код нечитаемым.

Ответы [ 4 ]

2 голосов
/ 11 марта 2009

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

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

Стандартный профилировщик может дать вам некоторое представление о статистической выборке вашей программы, чтобы увидеть, какие функции выполняются, но это не даст вам порядок вызовов, а только случайные места, в которых ваша программа выполняла код во время выборки.

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

1 голос
/ 11 марта 2009

Прежде всего. Если вы хотите что-то зарегистрировать, это займет время, независимо от того, как вы это сделаете. Это с помощью аспектного программирования или чего-то еще. Если ваше приложение критично ко времени, у вас должен быть переключатель для включения / выключения отладки.

Обновление: Оформить заказ http://perfinsp.sourceforge.net/hookit_linux.html

0 голосов
/ 21 сентября 2015

Вы можете получить некоторое расстояние от FUNCTION и некоторых макросов. Вам все равно придется добавлять макросы входа и выхода для каждой функции. Но, по крайней мере, вам не нужно повторно вводить имя функции.

Если вы в порядке с C ++ RAII, то вам нужен только макрос ввода в каждой функции.

0 голосов
/ 11 марта 2009

Ознакомьтесь с AspectC, вариантом C, расширенным с аспектно-ориентированными функциями (так же, как AspectJ является вариантом Java с аспектно-ориентированными функциями).

...