有没有一种简单的工具,可以用来确定一个函数是从哪里调用的,该函数调用了哪些其他函数...?
编辑:我正在使用Mac OS X(10.6),只想进行静态分析。
谢谢!
编辑:我正在使用Mac OS X(10.6),只想进行静态分析。
谢谢!
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);
不知道有没有简单的工具,但是免费的话,可以使用codeviz(如果你更喜欢阅读原始转储而不是生成图表,那么这个工具非常适合你)。注意:所有静态分析工具都会在虚拟调用方面存在一些问题,而且模板会更糟。