Простой инструмент для callgraph в C++

Есть ли существует простой инструмент, который может использоваться для определения от того, где функция вызвана, который другая функция вызовы функции...?

Править: Я использую Mac OS X (10.6) и просто хочу сделать статический анализ.

Спасибо!

5
задан Karl von Moor 9 February 2011 в 19:44
поделиться

3 ответа

Как насчет cscope ? Посмотрите на пункты 3 и 4 пули на странице:

  • функции, вызываемые функцией
  • функции, вызывающие функцию

Давненько я не пользовался cscope на C++, похоже, я помню, что он был очень твердым на C-коде, но не настолько твердым на C++.

4
ответ дан 13 December 2019 в 05:36
поделиться

Не знаю, что такое простые инструменты, но бесплатно есть codeviz (при желании можно читать необработанные дампы, а не генерировать графики). Caveat: все инструменты статического анализа имеют некоторые проблемы с виртуальными вызовами, а еще хуже - с шаблонами.

1
ответ дан 13 December 2019 в 05:36
поделиться

gtags - это инструмент, который можно использовать для добавления тегов, а также для отслеживания вызовов.

http://www.gnu.org/software/global/

Это поддерживает C, C ++, Yacc, Java и PHP4. Но он не может правильно обрабатывать шаблоны C ++ или другие сложные вещи.

Используя этот синтаксический анализатор тегов, я создал сценарий для получения дерева вызовов из
выбор пользователя через завершение bash, как показано ниже,
который отображает дерево вызовов в коде профилировщика Google:

% global-calltree -x prof_handler Add Evict ProfileData Stop DisableHandler RAW_CHECK WRITE_TO_STDERR
prof_handler:414 => Add:441               |profiler.cc                         |instance_.collector_.Add(depth, stack);
 Add:241 => Evict:290                      |profiledata.cc                      |Evict(*e);
  Evict:61 => ProfileData:75                |profiledata.cc                      |ProfileData::ProfileData()
   ProfileData:124 => Stop:125               |profiledata.cc                      |Stop();
    Stop:261 => DisableHandler:273            |profiler.cc                         |DisableHandler();
     DisableHandler:400 => RAW_CHECK:405       |profiler.cc                         |RAW_CHECK(sigaction(SIGPROF, &sa, NULL) == 0, "sigaction failed");
      RAW_CHECK:83 => WRITE_TO_STDERR:86        |base/logging.h                      |WRITE_TO_STDERR("Check failed: " #condition ": " message "\n",           \
       WRITE_TO_STDERR:59 => DECLARE_int32:65    |base/logging.h                      |DECLARE_int32(verbose);
7
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: