从cscope数据库生成调用树

14
我希望能够在Linux中从C和C++项目的cscope数据库中生成完整和部分呼叫树。由于项目规模很大,因此使用项目的完整调用树可能不容易处理,因此我想要通过类似于grep的函数名称过滤器来限制呼叫树的生成。此外,我还希望能够从任意点构建“被调用”和“调用”子树。因此,工具必须是交互式且易于打补丁。
附注: 我想使用cscope数据库,因为它已经在项目中使用,并且生成速度相当快。我使用vim编辑器并拥有X窗口系统。 SourceForge上有一个名为cbrowser的程序,但它的调用树(调用图)功能已损坏。

cscope是否处理间接或虚拟方法调用?如果不是,那么“完整的调用树”是什么意思?如果您愿意接受“部分调用树”,它可以有多部分(空调用树是有效的部分调用树,但并不是很有趣)。 - Ira Baxter
我在C项目中使用cscope。我不需要它非常精确,只需要使用"cscope"查询中的"调用"和"被调用"即可。我想要获取大型C项目中函数的完整调用图。它必须包括显式函数调用。其他任何内容都是可选的。 - osgx
5个回答

4

2

2
你有结果吗?能否提供一些源代码的截图,其中包含由cbrowser绘制的调用树? - osgx

1

除了cscope之外,我不知道还有哪些程序可以读取cscope数据库。即使是vim的cstag功能也只是启动一个后台cscope进程进行查询。

至于调用图生成,如果你不介意离开cscope,我更喜欢doxygen创建的内容。它们可能有点大,但它几乎从所有点生成图形,并且直接在其中浏览源代码非常容易。


1
我将这个基于cscope的Bash脚本成功地在Cygwin和Windows中运行:http://toolchainguru.blogspot.com/2011/03/c-calltrees-in-bash-revisited.html 看一下“graph”示例(我一直称它为调用“tree”,糟糕)。请参考来自Linux内核的示例。 它需要cscope(当然)和graphviz。它能够做上游和下游图,以及组合的上下游图(见示例)。
I haven't demonstrated it here but this method works really quite well on large projects where the same function might be defined in multiple directories. There will just be one node drawn for the same function name (so one "main" node even if you have multiple main()'s defined in your directory structure)---and you'll have multiple edges emanating from such a node, with file/line indicators. I found this aspect to be more useful than GNU cflow, which insisted on picking only one directory to look in. (The Jason Nyberg Bash script as is doesn't play well with threading, which GNU cflow handles nicely; something to keep in mind.)
我在这里没有演示,但是这种方法在大型项目中非常有效,因为相同的函数可能在多个目录中定义。对于相同的函数名,只会绘制一个节点(即使在目录结构中有多个main()),并且您将拥有从此类节点发出的多个边缘,带有文件/行指示器。我发现这一方面比GNU cflow更有用,后者坚持只选择一个目录进行查找。(要记住的是,Jason Nyberg的Bash脚本与线程不兼容,而GNU cflow可以很好地处理这一点。)

1

kscope 可能是另一个选择。我不确定它是否可以完成所有指定的任务,但对于 GUI 应用程序来说,它相当灵活。

Ubuntu 用户在运行时遇到问题,建议按照 这些说明 进行操作。


呈现调用树的截屏似乎是 http://sourceforge.net/dbimage.php?id=200328 - osgx
@osgx:谢谢。但我不确定楼主是在寻找那种意义上的树,还是要一个调用 - intuited
我需要两个。树很好,调用图更好,对于某些函数而言,最好的是调用图(过滤或子图)。另外,我是一个OP :) - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接