Я пытаюсь создать граф вызовов, с помощью которого можно узнать все возможные пути выполнения, которые попадают в конкретную функцию (так что мне не нужно выяснять все пути вручную, поскольку есть много путей, которые приводят к этой функции ). Например:
path 1: A -> B -> C -> D
path 2: A -> B -> X -> Y -> D
path 3: A -> G -> M -> N -> O -> P -> S -> D
...
path n: ...
Я пробовал Codeviz и Doxygen, почему-то оба результата не показывают ничего, кроме вызовов целевой функции D. В моем случае D является функцией-членом класса, объект которого будет заключен в интеллектуальный указатель. Клиенты всегда будут получать объект интеллектуального указателя через фабрику, чтобы вызвать D.
Кто-нибудь знает, как этого добиться?
источник
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
Что с этим делать? clang 3.8-analyze
по какой-то причине приходится убрать опцию. Другой вопрос: могу ли я установить для выходного файла другое значение, кроме./callgraph.dot
?Вы можете добиться этого с помощью doxygen (с возможностью использования точки для генерации графиков).
С Йоханнесом Шаубом - litb main.cpp он генерирует следующее:
doxygen / dot, вероятно, проще, чем clang / opt для установки и запуска. Самостоятельно установить не удалось, поэтому я попытался найти альтернативное решение!
источник
Статически вычислить точный граф вызовов C ++ сложно, потому что вам нужен точный синтаксический анализатор языка, правильный поиск имени и хороший анализатор точек, который должным образом учитывает семантику языка. В Doxygen их нет, я не знаю, почему люди утверждают, что им нравится C ++; легко построить 10-строчный пример C ++, который Doxygen анализирует ошибочно).
Возможно, вам лучше запустить профилировщик времени, который динамически собирает график вызовов (это описывает наш) и просто выполняет множество случаев. Такие профилировщики покажут вам фактический график вызовов.
РЕДАКТИРОВАТЬ: Я внезапно вспомнил « Понимание для C ++» , который утверждает, что строит графики вызовов. Я не знаю, что они используют для парсера и правильно ли проводят подробный анализ; У меня нет конкретного опыта работы с их продуктом.
Я впечатлен ответом Шауба с использованием Clang; Я ожидал, что у Кланга все элементы будут правильными.
источник
Вы можете использовать CppDepend , он может генерировать много видов графиков
источник
Чтобы
clang++
командаmpi.h
могла найти стандартные файлы заголовков, необходимо использовать две дополнительные опции-### -fsyntax-only
, т.е. полная команда должна выглядеть так:источник
«C ++ Bsc Analyzer» может отображать графики вызовов - путем чтения файла, созданного утилитой bscmake.
источник
doxygen + graphviz может решить большинство проблем, когда мы хотим сгенерировать граф вызовов, который затем будет передан персоналу.
источник
Scitools Understand - фантастический инструмент, который лучше всего, что я знаю для обратного проектирования , генерирует высококачественные графики .
Но обратите внимание, что это довольно дорого, и что в пробной версии график вызовов бабочки ограничен только одним уровнем вызова (ИМХО, я считаю, что они не помогают себе в этом ...)
источник