github.com/elcritch/etrace/issues/3

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

[[email protected] test]# cat hw.c
#include <stdio.h>

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

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

 Neil Butterworth30 мая 2011 г., 14:37
Ответ неверный.

Ответы на вопрос(4)

Решение Вопроса

-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, я сам не пробовал.

 compile-fan30 мая 2011 г., 14:43
@ Нил Баттерворт, могу ли я добавить эти 2 функции в мой.c подать вручную?
 Neil Butterworth30 мая 2011 г., 14:44
Вы могли бы, но реализовать их довольно сложно.
 compile-fan30 мая 2011 г., 14:47
@ Нил Баттерворт, я просто хочу напечатать имена функций, почему это сложно?
 Neil Butterworth30 мая 2011 г., 15:37
Вы должны скомпилировать код, который я дал отдельно, как код C,без флаг -finstrument-functions и затем связать полученный .o файл с вашим кодом. Это работает для меня на MingW GCC 4.5.1, но я не могу гарантировать другие платформы.
 Matthew Slattery30 мая 2011 г., 15:47
... или вместо компиляции отдельно, вы можете добавить__attribute__((no_instrument_function)) к объявлению__cyg_profile_func_XXX функции, которые остановят-finstrument-functions приборостроение, приборостроение.

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

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

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

 kchoi29 июл. 2016 г., 00:19
иногда .. действительно полезно просто напечатать имена fn для корректности отладки

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

 compile-fan30 мая 2011 г., 14:41
какие дополнительные шаги мне нужно предпринять, чтобы работать с-finstrument-functions выключатель? Я надеюсь, что это будет как можно меньше ...
 Jan Hudec30 мая 2011 г., 16:14
@ compile-fan: Theдокументация упоминает две функции, которые должны быть реализованы. Я не знаю, есть ли готовая библиотека, которая использует их.
У меня не сработало :-(github.com/elcritch/etrace/issues/3

Ваш ответ на вопрос