Подтвердить что ты не робот

Есть ли способ получить граф вызовов для определенной функции С++ в Visual Studio?

Интересно, есть ли инструмент для VS, который может показать мне график вызовов (то есть диаграмму, перечисляющую все возможные пути выполнения) для данной функции С++. Это поможет в навигации по большой базе кода, в случаях, когда функция вызывается только в нескольких местах.

Для так называемых функций, таких как printf, он может просто сказать:

слишком много опций...

Снова я думаю, что сделать такой инструмент не так-то просто, поэтому я задаюсь вопросом, существует ли он, но вы знаете, что это возможно сделать, чтобы вы никогда не знали...:)

EDIT: я знаю, что найти все ссылки, но это дает только сайты вызовов функции, а не сайт вызова функции, вызывающей функцию, вызывающую функцию...

EDIT: VS - 2010, но при необходимости VS2012 является опцией.

4b9b3361

Ответ 1

Вы упомянули, что знаете, что нашли все ссылки. Вы просмотрели просмотр Call Hierarchy? Вероятно, это не ваш "метод сновидений", но он позволяет вам смотреть на функцию с точки зрения "звонков на" и "звонков с" данной функции. Окно также позволяет добавлять несколько функций для просмотра в древовидном формате. Таким образом, в основном вы можете увеличивать или уменьшать возможные результаты.

Щелкните правой кнопкой мыши на желаемом методе (может быть где угодно в иерархии) = >

Выберите "Просмотреть иерархию вызовов"

Обратите внимание, что если вы можете добавить в окно несколько опорных точек. Удалить при необходимости

Вы также можете использовать Ctrl + K или Ctrl + T


Еще один прекрасный пример, IMHO, разочарование в различиях между С++ и С# с VS. Я думаю, что Code Maps будет именно тем, что вы ищете. Предполагая, конечно, что вы работали с Ultimate - но нет, а не с С++.

Ответ 2

Нет такой возможности в С++/MSVC, насколько мне известно.

Тем не менее, существует профайлер AQTime для окон, который имеет параметр "статического анализа", который (если я правильно помню) сканирует скомпилированный исполняемый файл, генерирует график вызовов и показывает вам недоступные функции.

Если я правильно помню, AQtime интегрируется в визуальную студию (профессиональное издание, afaik).

К сожалению, это коммерческий профайлер, который стоит около $500, и эта функция недоступна в пробной версии. Последний раз, когда я использовал статический анализ, было 3..4 лет назад, и я точно не помню подробностей на данный момент (и у меня нет доступа к AQTime больше). Во всяком случае, это специализированный инструмент, поэтому я бы не рекомендовал его покупать, если вы не оптимизируете код для скорости 24/7.

Возможно, по поисковому запросу "статический анализ", "охват кода" или исследование других профилировщиков вы найдете несколько схожий инструмент, который делает работу бесплатно.

Кроме того, doxygen может генерировать callgraphs для кода С++. В случае doxygen вам придется искать функции, которые никогда не называются сами.

Кроме того, Visual Studio 2008 имеет встроенную функцию графа вызовов (которая, я думаю, использует intellisense). В принципе, вы щелкаете правой кнопкой мыши любую функцию и выбираете "show callers" (или что-то в этом роде), которая откроет список всех функций (визуальная студия THINKS вызывает вашу функцию) в окне. Поскольку эта функция присутствовала в VS2008, она должна быть включена в VS2010. Однако он не может обнаружить каждого вызывающего абонента по очевидным причинам (виртуальные методы, обратные вызовы и т.д.).

Ответ 3

Возможно, доксиген - это инструмент, который вы ищете. Он предоставляет возможность генерировать графики вызовов (показывая все функции, вызываемые определенной функцией) и/или графики вызывающих абонентов (показывая функции, которые функция вызывает прямо или косвенно).

см.: http://www.doxygen.nl/manual/diagrams.html

Ответ 4

Взгляните на инструмент "Понимать" (http://www.scitools.com). Это отлично подходит для рисования графиков вызовов и контрольных блок-схем. К сожалению, это коммерческий.

Ответ 5

Вы можете разрешить результаты после выполнения поиска по символам. Просто щелкните правой кнопкой мыши в своем источнике, а затем выберите все ссылки, которые выполняют поиск символов. Он более подробно поясняется в http://blogs.msdn.com/b/vcblog/archive/2009/11/17/improvements-to-find-all-references-in-visual-studio-2010.aspx

Ответ 6

Вы можете попробовать CppDepend, который дает вам граф вызовов внутри VS и предоставляет множество функций в его графике зависимостей.

введите описание изображения здесь

Ответ 7

Source Navigator - это инструмент, который я использовал и был очень доволен проектами на С++. Опять же, это не в среде Visual Studio IDE, но оно имеет некоторые большие преимущества, если вы не против нажатия Alt-Tab: -)

  • работает как с источниками C, так и с С++.
  • довольно быстро в нем индексирование и поиск; это приятно использовать, IMHO
  • - это визуальный инструмент.
  • - бесплатный инструмент с открытым исходным кодом.

Смотрите http://sourcenav.berlios.de/screenshots/ для некоторых скриншотов

В частности, вы ищете Перекрестный справочный браузер:

"Он может найти каждый вызов функции или рассказать вам все специальные вызовы функций. Он создает древовидные диаграммы, которые показывают существенные отношения в базе данных символов проекта, такие как дерево иерархии функций. Вы можете перемещаться вверх и вниз по дерева иерархии, а также развернуть или ограничить дерево. Вы можете выбрать элементы в иерархии и отображать их ссылки на ссылки и ссылки отношения; эти отношения основаны на" точке зрения "выбранный символ."

Несмотря на то, что в этом примере показан скриншот из учебника, "Использование браузера перекрестных ссылок" показывает ссылки на отношения (с использованием красных стрелок) для класс, а не функция, последний вариант использования будет очень похож. Вы также можете просмотреть, какие функции/методы получаются вызванными из функции, и это будет отношение Refers-to, показанное с использованием синих стрелок вместо красного.

enter image description here

Попробуй! Как я упоминал ранее, я был счастливым пользователем этого инструмента; это не очень хорошо известно, но является хорошей частью программного обеспечения (что также является примером того, насколько полезным Tcl/Tk может быть в правильных руках).

Ответ 8

Я думаю, вы должны использовать VS Plugin - CodeGraph для своего решения и искать определенную функцию, которую вы ищете, и продолжать там. Он выполняет статический анализ вашего решения и генерирует хороший график потоков вызовов. Установите флажок https://marketplace.visualstudio.com/items?itemName=YaobinOuyang.CodeAtlas". Надеюсь, это поможет.