【问题标题】:Retrieve function call graph [duplicate]检索函数调用图[重复]
【发布时间】:2012-12-30 14:39:00
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您需要哪个操作系统?
  • windows(以及编辑过的问题)谢谢 :)
  • @MAG 你的用例是什么?为什么不直接设置断点并使用调试器向您显示调用堆栈?在 Windows 上,您可以在加载 dll 的 exe 上启动调试器,并且仍然会捕获 dll 中的任何断点。
  • 还要处理函数指针吗?
  • @MAG 不,正如我在评论中所说,静态分析器也几乎/几乎不可能跟踪函数指针。

标签: c++ function pointers stack


【解决方案1】:

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

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

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

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

【讨论】:

  • 啊,我自己也在 Windows 上寻找类似的东西,干杯伙伴!
  • 这有点像如果调用路径被击中,它会显示在我的结果中.. 但是如果调用路径没有被击中,那会怎样?所以我会知道只有当函数 X 被调用时才会调用我的函数 X ;但并非总是如此
  • @MAG 如果你的函数没有被调用,那么......你想读取哪个调用堆栈???除非您在谈论 CODE PATH,否则答案是 对不起,您不能,即使使用“普通”C++ 也不是微不足道的,但到处都有指针很漂亮不可能。
  • 是的代码路径是问...在linux上valgrinds给你代码路径吗?
  • @MAG 不,我们都了解运行时堆栈。试试这里推荐的工具:stackoverflow.com/questions/517589/…
【解决方案2】:

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

请看这里:http://valgrind.org/

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-10-30
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多