2012-06-05 2 views
1

У меня есть инструмент gcc для некоторых целей. Цель состоит в том, чтобы иметь возможность отслеживать, какие функции GCC вызываются во время особенно компиляции. К сожалению, я не очень хорошо знаком с архитектурой GCC, поэтому мне нужна небольшая помощь. Я пробовал выполнить следующие действия:Как использовать gcc?

1) Взлом gcc/Makefile.in и добавление флага «-finstrument-functions» в T_CFLAGS.
2) У меня есть уже реализованная и проверенная версия start_test и end_test функции. Они вызываются из gcc/main.c, до и после toplev_main(). Содержащий файл связан с gcc (объект добавляется в OBJS-common, а зависимость определяется позже в gcc/Makefile.in)
3) Загрузка необходимых компонентов с вкладками contrib/download_prerequisites.
4) Выполнение конфигурации из чистой директории сборки (на том же уровне с исходным Dir): ./../gcc-4.6.2/configure --prefix="/opt/gcc-4.6.2/" --enable-languages="c,c++"
5) Запуск сборки с «сделать все»

Это так, как я запущенной из памяти, хотя У меня было 28G.
Далее я попытался удалить настройки T_CFLAGS из Makefile и дать команде -finstrument-функции команде make: make CFLAGS="-finstrument-functions". Построение было успешным таким образом, но когда я попытался скомпилировать что-то, он привел к пустым выходным файлам. (Теоретически end_test должен был записать свой результат в данный файл.)

Что я могу сделать неправильно? Спасибо заранее!

+0

Вы хотите отследить внутренние функции GCC по мере их компиляции? Или что вы компилируете? –

ответ

1

, если только вы не исключите его от инструментальных, main самого подлежат инструментовки, поэтому размещение вызовов на start_test и end_testвнутриmain не так, как вы хотите это сделать. «Правильный» способ убедиться, что файл открывается и закрывается в нужное время, чтобы определить «конструктор» и «деструктор», и GCC автоматически генерирует вызовы к ним до и после main:

void start_test (void) 
    __attribute__ ((no_instrument_function, constructor)); 

void end_test (void) 
    __attribute__ ((no_instrument_function, destructor)); 

/* FILE to write profiling information. */ 
static FILE *profiler_out; 

void start_test (void) 
{ 
    profiler_out = fopen ("profiler.out", "w"); 
    if (profiler_out == NULL) 
    exit (-1); 
} 

void end_test (void) 
{ 
    fclose (profiler_out); 
} 

Сноски :

  1. подробнее о constructor, destructor и no_instrument_function атрибуты here. Это атрибуты функций, которые GCC понимает.
  2. Прочтите это excellent guide to instrumentation, на веб-сайте IBM.
+0

Хорошо, давайте посмотрим, правильно ли вы правильно поняли: Ваш эскиз кода выше идет в хелперный файл, скажем, в Instrumenter.c, что связано с проектом. Кроме того, я должен передать флаг -finstrument-functions в CFLAGS. И это все? Мне не нужно называть функции start_test и end_test в любом месте? – mirage

+0

@ user1437750 - Нет, вам не нужно это делать. Вставки GCC называет 'start_test' ('конструктор') и' end_test' ('destructor') до и после 'main', самостоятельно. – ArjunShankar

+0

@ user1437750 - Я добавил пару заметок с URL-адресами самому ответу. – ArjunShankar