LINUX.ORG.RU

Добавить ко всем функциям преамбулу.


0

0

Язык - Си. Необходимо разом сделать так, чтобы при входе в функцию вызывался мой произвольный код. При выходе желательно тоже. Я так понимаю, раз компилятор все-равно генерит эти декорации, то можно их как-то изменить. Код компилятора менять нельзя (нужно чтобы собиралось везеде без проблем). Решение нужно только для GCC.

Как такое можно сделать?

★★★★

Re: Добавить ко всем функциям преамбулу.

Это естественно нужно для всех функции без их модификации в программе.

alexru ★★★★ ()
Ответ на: Re: Добавить ко всем функциям преамбулу. от Valeriy_Onuchin

Re: Добавить ко всем функциям преамбулу.

Мда. Вообще-то это нужно для отладки embedded кода (платформа AVR). Зачем вирусокодерам обрамлять все функции. крорме того я не прошу чтобы это работало без перекомпиляции моей программы.

alexru ★★★★ ()

Re: Добавить ко всем функциям преамбулу.

(AVR) я так понимаю, что там и C++ должен работать.
тогда создаешь класс в конструкторе, которого
делаешь то, чтo "на входе", а в деструкторе, то, что "на выходе"
ставишь его в самом начале каждой функции

class QQ {
public:
QQ() { printf("hello!\n"); }
~QQ() { printf("good by!\n"); }
};

void func()
{
QQ qq();

....
}

вставку "QQ qq();" можно оформить ввиде С-макроса
или я не так понял вопрос?

Valeriy_Onuchin ★★ ()
Ответ на: Re: Добавить ко всем функциям преамбулу. от Valeriy_Onuchin

Re: Добавить ко всем функциям преамбулу.

Естественно можно самому во все входы и выходы из функций вставить макросы типа FN_IN(), FN_OUT(). Но это не сделает более читаемым код и к тому же придется следить, чтобы все новые функции имели такое обрамление. Моя идея состоит в том, чтобы добавить к прологам/эпилогам которые генерит компилятор свой код. Тогда автоматически эта подстановка будет сделана для всех функций.

С++ там конечно есть, но вообще-то 128к флеша и 8к озу не способствуют написанию на нем :)

alexru ★★★★ ()

Re: Добавить ко всем функциям преамбулу.

Давно видел. Посмотрите руководство к gprof кажется. Там вроде был пример, как для GCC склепать дополнительную обертку к функции.

vasily_pupkin ★★★★★ ()

Re: Добавить ко всем функциям преамбулу.

AspectC ?

tailgunner ★★★★★ ()

Re: Добавить ко всем функциям преамбулу.

>Вообще-то это нужно для отладки embedded кода (платформа AVR).
Для отладки наверно лучше пользоваться отладчиками
http://www.oshec.org/articles/otladka-avr-pod-linuh/otladka-avr-pod-linuh

koTuk ()

Re: Добавить ко всем функциям преамбулу.

Вероятно. Но тут сильно сложный код с кооперативной многозадачностью и огромным числом callback-ов. Нужно именно постоянно писать лог, чтобы если чего произойдет иметь представление о том, как оно рпоизошло.

alexru ★★★★ ()

Re: Добавить ко всем функциям преамбулу.

> Не думаю.

То, что ты хочешь сделать, называется как раз аспектно-ориентированным программированием. tailgunner прав.

> Предлагаешь переписать все на новом языке?

Для нормального использования AOP язык должен в явном виде поддерживать эту возможность. Лучше всего переписать всё на Лиспе, для которого аспекты можно хоть в рантайме создавать делать, подключив на ходу библиотеку AspectL. И много других вещей тожно можно на ходу делать.

mv ★★★★★ ()

Re: Добавить ко всем функциям преамбулу.

>Но тут сильно сложный код с кооперативной многозадачностью и огромным числом callback-ов.
Звучит конечно сильно :) я так понимаю там atmega128 - как на ней реализована многозадачность ? если переключение задач через прерывания таймера то можно дописать в обработчике прерываний логирование текущего состояния - конечно не решит полностью проблему но хоть какие-то данные будут на момент краха :) логи можно через usart на хост-РС отправлять.

koTuk ()

Re: Добавить ко всем функциям преамбулу.

Напиши на перле (или на чём ещё умеешь) скрипт, который пройдётся по исходниками и вставит аспекты в каждую функцию.

mv ★★★★★ ()

Re: Добавить ко всем функциям преамбулу.

Многозадачность кооперативная - когда задача отправляет пакет она не блокируется, а возвращает управление планировщику, предапрительно установив callback на пришедшие даные. И таких колбэков КУЧА. Подход позволяет эффективно использовать ресурсы, но ужасен с точки зрения отладки.

На самом деле мне вероятно будет проше GCC собрать с новыми прологами и эпилогами.

alexru ★★★★ ()

Re: Добавить ко всем функциям преамбулу.

> В отладочных

Тогда посмотри таки на AspectC. Насколько я понял, _переписывать_ там ничего не надо.

> вероятно будет проше GCC собрать с новыми прологами и эпилогами.

Я так понимаю, требование "код компилятора менять нельзя (нужно чтобы собиралось везеде без проблем)" отпало само? :)

tailgunner ★★★★★ ()
Ответ на: Re: Добавить ко всем функциям преамбулу. от tailgunner

Re: Добавить ко всем функциям преамбулу.

> Я так понимаю, требование "код компилятора менять нельзя (нужно чтобы собиралось везеде без проблем)" отпало само? :)

Хотелось чтобы возможности отладки присутствовали в программе всегда. Если не получится сделаю только для себя :)

alexru ★★★★ ()

Re: Добавить ко всем функциям преамбулу.


GCC умеет это делать из коробки (Instrument Functions).

Смотри для начала скажем http://www.ddj.com/cpp/184401956
(параграф Function Hooks).

Или вот - http://ndevilla.free.fr/etrace/ - тут instrument functions
используются для построения run-time call tree.

HTH

Onanim ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.