3

可能重复:
获取代码图形函数调用图的工具

我很久以前在 dll 中(在 Windows 上)写了一个 C++ 函数......有些人写了 api ,使用函数指针调用我的函数,有些人只是调用它..

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

有没有办法我可以很容易地做到这一点。我的意思是当我查找调用者(代码路径)时,由于函数指针的方式,我基本上必须手动做很多工作。因此,如果有任何相同的开源解决方案,请分享..

我不想使用断点或自己编写函数来显示堆栈。原因是因为这有点像如果调用路径被击中,它会显示在我的结果中..但是如果调用路径没有被击中,那会怎样?所以我会知道只有当函数 X 被调用时才会调用我的函数 X ;但并非总是如此

4

2 回答 2

3

你没有说你需要哪个操作系统,如果是Linux,你有@Magnus 的答案,如果是Windows,你可以阅读这个。

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

幸运的是,有一个 Windows 函数可以做到这一点:Debug Help Library中的StackWalk64(不要介意后缀,它适用于 32 位和 64 位)。在那里,您可以找到在每个已知平台中解析完整堆栈所需的所有函数(使用调试信息(如果存在)来解析和取消修饰函数名称)。-64

您可以阅读CodeGuru上的这篇文章以获取完整的工作示例。

于 2013-01-16T10:18:20.417 回答
2

如果您主要关心的是在运行时查找函数的所有调用者,您可以查看 callgrind 或 cachegrind 作为 valgrind 套件的一部分。有一些 GUI 工具可以可视化连接,它对于许多其他问题也很有用。

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

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

于 2013-01-16T10:03:08.747 回答