Визуализация кода C++

своего рода последующий / связанный вопрос к этой.

Я пытаюсь ухватиться за большую базу кода, которая имеет сотни и сотни классов и большую иерархию наследования. Я хочу иметь возможность сразу увидеть "основные вены" иерархии наследования - не все "периферийные" классы, которые делают только некоторые очень специфические / специализированные вещи. Visual Studio "View Class Diagram" делает что-то похожее на поезд и его растянутое по горизонтали по всему экрану и не очень организованно. Вы не можете легко понять это.

Я только что пробовал doxygen и graphviz, но результаты есть .. несколько похоже на Visual Studio. Я получаю сладкие графики вызовов, но снова слишком много деталей за то, что я пытаюсь сделать.

Мне нужен быстрый способ создания иерархии наследования, в какой-то складной вид.

9 ответов


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


хороший инструмент UML должен сделать трюк.

вот список общих инструментов UMl:http://en.wikipedia.org/wiki/List_of_UML_tools

есть много там, все с разными наборами функций. Попробуйте сыграть с несколькими, чтобы увидеть, получаете ли вы желаемый результат. Если они бесплатные не вам, вам, возможно, придется выложить за хороший коммерческий инструмент UML


вы можете попробовать CppDepend, он не создает иерархию классов, как Doxygen, но он может показать "большую картину" для вашего проекта, он также показывает некоторые метрики кода.


вместо того, чтобы переходить в инструмент конструктора полного класса, просто используйте "представление класса" или "Обозреватель объектов" в Visual Studio - они представляют полностью сворачиваемые наследственные классы.


У меня был наибольший успех с valgrind и kcachegrind, чтобы сделать это. Вы запускаете valgrind против вашего двоичного файла отладки, выполняете любые действия, которые вас интересуют, а затем импортируете вывод в kcachegrind, чтобы увидеть все, что вы когда-либо хотели знать о том, кто что вызывал, как часто и когда. Кроме того, поскольку вы делаете это динамически, он ловит случаи, которые статический анализ, вероятно, не будет.

Я также имел некоторый успех, используя функции обратного проектирования Enterprise Architect, хотя это не заканчивается почти так же хорошо (но вы получаете работоспособную модель UML, которая хороша!).

и, наконец, инструмент под названием "понять". Это довольно хорошо при статическом анализе OO, но я думаю, что довольно дорого и не так широко используется.


попробовать Source Insight в этом инструменте можно настроить глубину сгенерированного графика.

см. также C/C++ call-graph утилита для платформы Windows


проверить SourceNavigator, это с открытым исходным кодом, работает на куче платформ и имеет браузер иерархии, браузер классов, браузер перекрестных ссылок и многое другое, что позволит вам перемещаться и понимать код.

Я использую его в течение некоторого времени, особенно когда у меня есть новый код, чтобы пройти и понять.


для коммерческого продукта по разумной цене, вы можете проверить SolidSX от Vizlogix (www.vizlogix.com). (Если вы находитесь за пределами Северной Америки, перейдите к SolidSource -- www.solidsourceit.com.)

Он генерирует радиальную диаграмму, которая может быть свернута и расширена. Он также интегрируется с Visual Studio (как BSC, так и .NET).


каково ваше определение "основной вены"? Вам нужен либо редуктор графа, либо скелетизер (вы можете найти или написать его и применить к тому, что производят Doxygen и остальные), либо "главная Вена" имеет какое-то отношение к функции кода, и я не думаю, что автоматический инструмент может помочь вам в этом. Если вы не можете указать ему: "это важные биты, которые делают ввод и вывод, покажите мне только элементы, которые находятся в одном или двух шагах от путей между ними". Хм, звучит круто. инструмент для записи:)

... иерархия наследования в каком-то складном виде.

опять же, хорошая идея для инструмента!