Для регистрации входа в функцию и выхода есть -finstrument-functions
который укажут вызываемую и вызывающую функцию, ну и вход и выход из функций.
#include <stdio.h>
char * str = 0;
void __cyg_profile_func_enter (void *, void *) __attribute__((no_instrument_function));
void __cyg_profile_func_exit (void *, void *) __attribute__((no_instrument_function));
void __cyg_profile_func_enter (void *func, void *caller)
{
printf("start \n");
}
void __cyg_profile_func_exit (void *func, void *caller)
{
printf("end \n");
}
void func(){}
int main(int argc, char *argv[])
{
func();
return 0;
}
dron@gnu:~/Рабочий-стол$ gcc cc.c -Wall -pedantic -std=c11 -finstrument-functions
dron@gnu:~/Рабочий-стол$ ./a.out
start
start
end
end
dron@gnu:~/Рабочий-стол$
Есть ли что-то такое же, но для макросов? Суть. Я для себя лабаю трассировщик вызовов, да я знаю про backtrace_*() функции. Но без объяснений почему я его не хочу, я его не хочу в данном случае. Ну если кратко быстрее __func__,__FILE__
из тела при вызове отдать чем дрыгать backtrace_*()
который будет дрыгать таблицы. Но но это не суть вообще.
Сейчас я делаю тупо вставку макросов в начало и конец функции, если есть return то перед каждым return то есть перед выходом
/*
RS --Record Start
RE --Record End
PB --Print Backtrace
*/
void function_5() {RS RE}
void function_4() {RS function_5(); function_5(); function_5(); RE}
void function_3() {RS function_4(); function_4(); function_4(); RE}
void function_1() {RS function_3(); PB; RE}
void function_2() {RS function_1(); function_1(); function_1(); RE}
int main()
{
RS
function_2();
RE
}
с выхлопом
dron@gnu:~/Рабочий-стол/HUNTER$ gcc cc.c
dron@gnu:~/Рабочий-стол/HUNTER$ ./a.out
┣━━━━━━ frame ━━━━━━━>
cc.c:main()
└─> cc.c:function_2()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ ┗━> backtrace from ━━━> cc.c:function_1()
┣━━━━━━ frame ━━━━━━━>
cc.c:main()
└─> cc.c:function_2()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ ┗━> backtrace from ━━━> cc.c:function_1()
┣━━━━━━ frame ━━━━━━━>
cc.c:main()
└─> cc.c:function_2()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ └─> cc.c:function_1()
│ │ └─> cc.c:function_3()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ └─> cc.c:function_4()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ │ │ └─> cc.c:function_5()
│ │ ┗━> backtrace from ━━━> cc.c:function_1()
dron@gnu:~/Рабочий-стол/HUNTER$
Всё хорошо (ну ещё доделывать надо но суть ясна) только расставлять макросы муторно.
Вариантов вижу три
-
1 руками
-
2 парсером каким, который определит что это функция, вот её начало, а вот конец, а вот return и return вдруг сам не макрос
-
3 чем то типа
-finstrument-functions
но для макросов
Вот собсна всё. Чво посоветовать по этому поводу есть?