LINUX.ORG.RU

Средства для получения графа вызовов функций Си(++) статически, имея qt creator

 , , ,


1

4

Доброго времени суток. Есть нужда узнать какие функции из каких вызываются в коде на си/си++. Не в рантайме, а в принципе, кто кого вызывает по коду. Из сред разработки моём распоряжении qt creator, и хочется получить граф (дерево) вызовов посредством статического просмотра кода. Знает ли кто, как это можно сделать посредством creator-а, или может существуют отдельные инструменты, которые проанализировав код, смогут выдать мне такую информацию?

★★

Точно была такая утилита, видел два года назад и даже устанавливал. Работает на Python. Но сейчас принялся искать по закладкам, и не нашёл, а название за два года забыл.

Её прекратили разрабатывать где-то в 2020-2021, но последняя версия точно ставилась и работала у меня без проблем.

emorozov
()

Есть нужда узнать какие функции из каких вызываются в коде на си/си++. Не в рантайме, а в принципе, кто кого вызывает по коду.

Про виртуальные функции, указатели на функции (или, более общо, std::function) слышал? В чём-то больше hello worlda статически узнать кто кого вызывает сложно.

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: комментарий от fluorite

Да, это оно! Был уверен, что добавил его в stars на GitHub, но сейчас звезды не оказалось почему-то.

Я его попробовал на немаленьком Python проекте (что-то от 50 до 100 тыс строк). Он долго пыхтел, но показал мне диаграмму классов, даже более-менее правильную. Но я правда так и не смог ощутить, какие это даёт мне преимущества, т.к. проект был хорошо написан, и я в нем прекрасно ориентировался даже без диаграмм.

Надо будет как-нибудь попробовать на плохо написанном проекте, с таким тоже приходится работать, к сожалению.

emorozov
()
Ответ на: комментарий от sigurd

clang+opt или dozygen+graphviz

Попробовал доксиген с гарфвизом, и не нашёл ни каких диаграмм, только раздел списка файлов, списка структур, функций.

У меня код в один файл на чистом си, выставил опцию оптимизации для Си, опцию выводить всё, а не тольк документированное, опцию «Use dot tool from the GraphViz package», в подразделе добавил «Call graphs» и «Called by graphs», и в результате не нашёл никаких графов. ЧЯДНТ?

normann ★★
() автор топика

cflow, но быстрого пути для встраивания в qt creator не знаю. Ещё хорошую вещь тут уже советовали - SourceTrail, но к нему придётся привыкать. cflow же просто вырабатывает граф, который можно исполнять graphviz.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)
Ответ на: комментарий от normann

Что такое opt?

Часть llvm. Зачитываю man opt -
The opt command is the modular LLVM optimizer and analyzer. It takes LLVM source files as input, runs the specified optimizations or analyses on it, and then outputs the optimized file or the analysis results.

$ clang++ -S -emit-llvm main.cpp -o - | opt -analyze -dot-callgraph
$ dot -Tpng -ocallgraph.png callgraph.dot
sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от normann

и в результате не нашёл никаких графов. ЧЯДНТ?

Видимо - не читаете документацию. Поиск поможет -
https://www.google.com/search?q=doxygen+граф+вызовов+функций

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)

Есть нужда узнать какие функции из каких вызываются в коде на си/си++. Не в рантайме, а в принципе, кто кого вызывает по коду. Из сред разработки моём распоряжении qt creator, и хочется получить граф (дерево) вызовов посредством статического просмотра кода.

Статическим анализом эта задача в общем случае не решается т.к. C/C++ code navigation, call graph (комментарий)

ну и там в той теме есть советы еще

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от sigurd

Видимо - не читаете документацию. Поиск поможет -

Читаю, и всё делаю по ней.

Проблема заключалась не в документации, а в том, что у меня не были выставлены, запрятанные в экспертный режим опции EXTRACT_STATIC, EXTRACT_PRIVATE и EXTRACT_ALL (в тексте без одной все функции static).

normann ★★
() автор топика