LINUX.ORG.RU

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


0

0

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

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

★★★★

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

alexru ★★★★
() автор топика
Ответ на: комментарий от Valeriy_Onuchin

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

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

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

void func()
{
QQ qq();

....
}

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

Valeriy_Onuchin ★★
()
Ответ на: комментарий от Valeriy_Onuchin

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

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

alexru ★★★★
() автор топика

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

vasily_pupkin ★★★★★
()
Ответ на: комментарий от koTuk

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

> Не думаю.

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

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

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

mv ★★★★★
()
Ответ на: комментарий от alexru

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

koTuk
()
Ответ на: комментарий от alexru

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

mv ★★★★★
()
Ответ на: комментарий от alexru

> Не думаю.

Тебе виднее.

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

Я думал, тебе в чисто отладочных целях.

tailgunner ★★★★★
()
Ответ на: комментарий от koTuk

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

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

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

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

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

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

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

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

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

Я не вижу, чем аспекты под #ifdef хуже, чем патченный компилятор. Чем лучше - вижу. Впрочем, решать тебе.

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