c++ - 检索函数调用图

标签 c++ function pointers stack

<分区>

Possible Duplicate:
Tools to get a pictorial function call graph of code

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

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

有没有办法让我轻松做到这一点。我的意思是,当我查找调用者(CODE PATHS)时,由于函数指针的存在,我基本上必须手动做很多工作。因此,如果有相同的开源解决方案,请分享..

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

最佳答案

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

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

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

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

关于c++ - 检索函数调用图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14355673/

相关文章:

c++ - C++ 中的排序函数如何工作?

C:将自由语句移动到单独的函数中会导致内存泄漏

c - 将结构变量传递给函数 : segfault

c++ - 为什么使用 _access 时只读测试对读写文件有效?

c++ - 编译opencv程序导致gcc -I/usr/local/lib test.cpp test.cpp :1:10: fatal error: opencv2/core. hpp: No such file or directory

c++ - OpenCL 程序未执行

sql - 如何处理postgresql函数中的单引号

javascript - 将函数结果作为 For 循环中数组的元素传递

javascript - 在使用 highcharts 库制作的图表上添加 onclick 事件

c - 带有类型转换的讨厌的指针数组,Invalid Initializer 错误