Почему у меня не работает `-finstrument-functions`? - PullRequest
5 голосов
/ 30 мая 2011

Согласно этому ответу , он должен напечатать все имена функций:

[root@ test]# cat hw.c
#include <stdio.h>

int func(void)
{  
  return 1;
}
int main(void)
{
  func();
  printf("%d",6);
  return 6;
}
[root@ test]# gcc -Wall hw.c -o hw -finstrument-functions
[root@ test]# ./hw 
6
[root@ test]# gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.

Но почему это не работает для меня?

Ответы [ 4 ]

6 голосов
/ 30 мая 2011

Это из руководства gcc:

-finstrument-функции

Генерация инструментария для вызовов вход и выход в функции. Просто после ввода функции и непосредственно перед функция выхода, следующее профилирование функции будут вызываться с адрес текущей функции и его сайт вызова. (На некоторых платформах __builtin_return_address не работает за пределами текущей функции, поэтому Информация о сайте звонка не может быть доступны для функций профилирования в противном случае.)

void __cyg_profile_func_enter (void * this_fn, void * call_site);

void __cyg_profile_func_exit (void * this_fn, void * call_site);

Если что-то не реализует эти функции, вы получите ошибки компоновщика (что и происходит с MinGW). Вероятно, ваша версия GCC предоставляет пустые реализации.

Я получил его для работы с MinGW GCC, предоставив эту реализацию:

#include  <stdio.h>

void __cyg_profile_func_enter (void *this_fn, void *call_site) {
    printf( "entering %p\n", this_fn );
}

void __cyg_profile_func_exit (void *this_fn, void *call_site) {
    printf( "leaving %p\n", this_fn );
}

но это дает только адреса функций. Я бы подумал, что это должна быть реализация GCC по умолчанию, но, похоже, ее нет.

Людей также может заинтересовать эта визуализация дерева вызовов , в которой используется флаг -fintrument-functions - caveat, я сам не пробовал.

1 голос
/ 30 мая 2011

На самом деле вы не реализовали никаких инструментов.Переключатель -finstrument-functions просто указывает gcc на вызов некоторой функции при входе и выходе из каждой функции.Но вы должны определить эти функции самостоятельно (обычно это делается путем связывания библиотеки профилировщика в).

0 голосов
/ 31 октября 2014

Предоставляется реализация того, что вы ищете здесь .

0 голосов
/ 10 ноября 2013

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

наткнулся на следующую статью - http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

Который использует addr2line из binutils для этой цели. Проверьте, поможет ли это вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...