检索函数调用图

时间:2013-01-16 10:00:29

标签: c++ function pointers stack

  

可能重复:
  Tools to get a pictorial function call graph of code

我在dll(在windows上)长时间写了一个C ++函数... 有些人写了api,用函数指针调用我的函数,有些只是调用它..

我想知道我的函数的调用者(代码路径)是谁。我想分析每个api调用我的函数的堆栈。

有没有办法可以轻松完成。我的意思是当我查找调用者(代码路径)时,由于方式中的函数指针,我基本上必须手动执行大量工作。因此,如果有相同的开源解决方案,请分享..

我不希望自己使用断点或写函数来显示堆栈。原因是因为如果调用了一个调用路径,它会显示在我的结果中......但是如果一个调用路径没有命中那么什么呢?所以我会知道一个函数X只有在调用函数X时才调用我;但并非总是如此

2 个答案:

答案 0 :(得分:3)

您没有说明您需要哪种操作系统,如果 Linux 您有@Magnus答案,如果它是 Windows ,您可以阅读此内容。

在C ++中获取调用堆栈绝非易事。您不需要太多代码来将调用堆栈作为内存地址,但将它们映射到函数名称可能非常棘手(因为您必须在每个模块中的每个地址处解析函数)。

幸运的是,有一个Windows功能可以执行此操作:来自StackWalk64Debug Help Library(不介意-64后缀,它可以在32位和64位上运行)。在那里,您可以找到在每个已知平台中解析完整堆栈所需的所有功能(使用调试信息,如果存在,则解析和取消设计函数名称)。

您可以阅读this article on CodeGuru了解完整的工作示例。

答案 1 :(得分:2)

如果你主要关注的是在运行时查找函数的所有调用者,你可以将callgrind或cachegrind作为valgrind套件的一部分来查看。有一些GUI工具可以显示连接,它也可用于解决许多其他问题。

见这里:http://valgrind.org/

编辑:更确切地说,这个工具:http://valgrind.org/info/tools.html#callgrind