【问题标题】:How to list all calls of a function at runtime?如何在运行时列出函数的所有调用?
【发布时间】:2017-07-12 10:41:58
【问题描述】:

有没有办法列出 (在VS中显示,写入文件) 所有调用者 (对象,函数) 函数的 在程序运行时?可能使用调试器?

我需要记录 所有调用(包括调用者)函数从程序启动到终止。

对源代码或二进制文件的简单扫描不起作用,因为该程序可以作为接收请求以调用所需函数的服务器运行。

如果 Visual Studio 不提供此功能,是否有其他解决此问题的方法?

【问题讨论】:

  • 如果你确保函数从不内联,那么可能有一个 API 可以查看调用堆栈,然后你可能能够从堆栈中找出调用者
  • 但如果可能的话我不想手动执行此操作。
  • 您也许可以使用堆栈指针来获取返回地址。问题是从发布可执行文件中删除了函数名称。
  • 另一个问题是操作系统可以将您的程序加载到内存中的任何位置,因此每次调用程序时地址可能不同。
  • 可以是调试版。

标签: visual-studio function debugging runtime call


【解决方案1】:

VS profiler工具对你也有帮助,你可以选择“CPU采样”的方法。

完成后,您可以选择“Caller/Callee”。

参考:

https://docs.microsoft.com/en-us/visualstudio/profiling/caller-callee-view

更新: 我们可以导出报告:

【讨论】:

  • 你能把这些输出到文件中吗?
  • @Shiro,是的,我们可以导出报告。我编辑我的答案。
【解决方案2】:

IMO,您最好的解决方案是添加日志记录功能。

查找对您的函数的所有调用。在调用函数之前将某种信息打印到日志文件中。这将为您提供函数调用的注释历史记录。

另一个想法是使用文档工具,例如 Doxygen,它可以打印“调用者”和“被调用者”图。但是,这不是在您的程序执行期间。

【讨论】:

  • 问题恰恰出在运行时方面。这样我就不会看到程序如何作为接收调用的服务器。
  • 这是真的。您可以用宏替换该函数(yuck)并记录调用者的函数名称(可用作宏,但我不记得是什么)
  • 是否有包含调用者姓名的宏?
  • 但这只是被调用函数的名称而不是调用者的名称。
  • @Shiro 没错。这就是您可以将函数包装在宏中的原因:#define MY_FUNCTION(...) do { logFunctionName(__FUNCTION__); myActualFunction(__VA_ARGS__); } while (0)
【解决方案3】:

如果您的程序是 .NET 应用程序,您可以使用我的Runtime Flow 工具在程序运行时查看函数的所有调用者。

【讨论】:

  • 很棒的应用程序! :) 感谢分享。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多