Макросы, вызывающие проблемы с dladdr () - PullRequest
0 голосов
/ 08 апреля 2010

Я реализовал поведение трассировки, используя опцию -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()

Редактировать: Чтобы уточнить: я ищу решение, которое не позволит макросам связываться с инструментальными функциями (чего они не должны делать). Не для методов для отслеживания макросов, функций и / или других вещей.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Если вы действительно хотите покопаться в этом, вы можете увидеть мой ответ на разбивка кода C ++ . Шаблоны C ++ на самом деле являются просто более формальными макросами, так что это может сработать для вас.

Также не может быть, поскольку LINE и FILE в макросе соответствуют вызывающей стороне.

редактировать из моего комментария к этому:

$ gcc -E foo.c | gcc -x c-cpp-output -c -finstrument-functions - -o foo.o

препроцесс передан в gcc, ожидая предварительно обработанного ввода на стандартном вводе

1 голос
/ 08 апреля 2010

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

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

...