Я реализовал поведение трассировки, используя опцию -finstrument-functions
gcc и этот (упрощенный) код:
void __cyg_profile_func_enter(void *this_fn, void *call_site)
{
Dl_info di;
if(dladdr(this_fn, &di))
printf("entered %s\n", (di.dli_sname?di_dli_sname:"<unknown>"));
}
Это прекрасно работает, за исключением одного: макросы также обрабатываются, но функция выводит информацию о функции, которая содержит макрос.
Таким образом, функции, содержащие макросы, печатают свою информацию несколько раз (что, конечно, нежелательно).
Есть ли что-нибудь, чтобы обнаружить, что макрос обрабатывается? Или вообще можно отключить инструментальные макросы?
PS Те же проблемы возникают с sizeof()
Редактировать: Чтобы уточнить: я ищу решение, которое не позволит макросам связываться с инструментальными функциями (чего они не должны делать). Не для методов для отслеживания макросов, функций и / или других вещей.