Есть ли существует простой инструмент, который может использоваться для определения от того, где функция вызвана, который другая функция вызовы функции...?
Править: Я использую Mac OS X (10.6) и просто хочу сделать статический анализ.
Спасибо!
Как насчет cscope ? Посмотрите на пункты 3 и 4 пули на странице:
Давненько я не пользовался cscope на C++, похоже, я помню, что он был очень твердым на C-коде, но не настолько твердым на C++.
Не знаю, что такое простые инструменты, но бесплатно есть codeviz (при желании можно читать необработанные дампы, а не генерировать графики). Caveat: все инструменты статического анализа имеют некоторые проблемы с виртуальными вызовами, а еще хуже - с шаблонами.
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);