C++中用于生成调用图的简单工具

4
有没有一种简单的工具,可以用来确定一个函数是从哪里调用的,该函数调用了哪些其他函数...?
编辑:我正在使用Mac OS X(10.6),只想进行静态分析。
谢谢!

Eclipse可以为Java做到这一点,我从未尝试过C++,但可能也可以在那里实现? - falstro
这通常是您所使用的集成开发环境(IDE)的一个功能。例如,在 Visual Studio 2008 中,您有“查找所有引用”。(我通常不在 C++ 中使用这些功能,因为我发现大部分都有漏洞。) - Daniel Daranas
1
简单的工具?在C++中解析名称引用本身就很难。 - Ira Baxter
4个回答

7

gtags是一个工具,您可以用它进行标记和调用跟踪。

http://www.gnu.org/software/global/

该工具支持C、C++、Yacc、Java和PHP4,但无法正确处理C++模板或其他复杂的内容。

使用此标记解析器,我编写了一个脚本,通过bash自动补全从用户的选择中获取调用树,如下所示:

这将在Google Profiler代码中显示调用树:

% global-calltree -x prof_handler Add Evict ProfileData Stop DisableHandler RAW_CHECK WRITE_TO_STDERR
prof_handler:414 => Add:441               |profiler.cc                         |instance_.collector_.Add(depth, stack);
 Add:241 => Evict:290                      |profiledata.cc                      |Evict(*e);
  Evict:61 => ProfileData:75                |profiledata.cc                      |ProfileData::ProfileData()
   ProfileData:124 => Stop:125               |profiledata.cc                      |Stop();
    Stop:261 => DisableHandler:273            |profiler.cc                         |DisableHandler();
     DisableHandler:400 => RAW_CHECK:405       |profiler.cc                         |RAW_CHECK(sigaction(SIGPROF, &sa, NULL) == 0, "sigaction failed");
      RAW_CHECK:83 => WRITE_TO_STDERR:86        |base/logging.h                      |WRITE_TO_STDERR("Check failed: " #condition ": " message "\n",           \
       WRITE_TO_STDERR:59 => DECLARE_int32:65    |base/logging.h                      |DECLARE_int32(verbose);

能否分享一下使用这个标记解析器的脚本? - Ahmed Fasih

4

你觉得 cscope 怎么样?请查看页面上的第三和第四个项目:

  • 被函数调用的函数
  • 调用函数的函数

我已经有一段时间没有在C++中使用cscope了,我记得它在C代码上非常稳定,但在C++上不如强大。


谢谢。虽然它只适用于C语言,但我找到了所有想要找到的东西。 - Karl von Moor

1

不知道有没有简单的工具,但是免费的话,可以使用codeviz(如果你更喜欢阅读原始转储而不是生成图表,那么这个工具非常适合你)。注意:所有静态分析工具都会在虚拟调用方面存在一些问题,而且模板会更糟。


0

由于您使用的是Mac OS,clang是一种带有静态分析功能的新编译器。

以下是一个YouTube上的示例: 使用clang查找错误


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