问题标签 [call-graph]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
24806 浏览

c - 使 GDB 在调用函数时打印控制流

如何在调用 gdb 时打印感兴趣的函数,并根据它们在堆栈中的深度进行缩进?

我希望能够说类似(编造)的话:

并让 gdb 打印所有以 Foo 或 Bar 开头的函数,因为它们被称为。有点像 gnu cflow,除了使用调试符号并且只打印实际调用的函数,而不是所有可能的调用流。

无济于事的工具包括 cachegrind、callgrind 和 oprofile,它们对最常调用函数的结果进行排序。我需要保留调用顺序。

通配符(或等价物)是必不可少的,因为有很多 Foo 和 Bar 函数。虽然我会满足于记录每个功能。或者,也许告诉 gdb 记录特定库中的所有函数。

一些 GDB 向导必须有一个脚本来完成这个常见的工作!

0 投票
4 回答
2227 浏览

.net - 如何查看 .NET 程序的动态调用图的可视化?

是否有用于可视化动态调用图的工具?我看到了对 Visual Basic 6 的一个参考,但我想要一个用于 .NET 的参考。

如果我必须自己构建一个可视化器,我应该使用.NET 分析 API还是应该使用Mono.Cecil做一些事情?我开始使用 Cecil 编写 CLI 运行时,但我想如果我只是在程序集中注入调用图记录调用会更容易,尽管因为我不提前知道执行路线并且必须检测所有内容。

0 投票
3 回答
1639 浏览

refactoring - 将 C Callergraphs 与 Doxygen 合并或确定所有调用的联合

我有一组遗留的 C 代码,我正在重构这些代码以将 C 计算代码从 GUI 中分离出来。这由于高度递归的数学核心代码是 K&R 风格的声明而变得复杂。由于函数参数的嵌套使用,我已经放弃了将这些转换为 ANSI 声明的尝试(只是无法消除最后 4 个编译器错误)。

我需要将一些文件移动到纯 DLL 中并确定要公开的最小接口,这将需要编写包装函数来发布类型化接口。

我已经使用 Doxygen @callergraph 标记标记了关键源文件,以便为各个函数生成信息图。除此之外,我想做的是合并这些图表,这样我就可以确定暴露给外界的函数的最窄边界。

原始头文件没有用——它们将所有内容都暴露为无类型的 C 函数。

有数百个函数,所以对生成的调用者图的简单检查是痛苦的。

我正在考虑编写某种 DOT 合并工具 - 设置 DOT_CLEANUP=NO 使 Doxygen 将中间 DOT 文件留在那里,而不是只保留它们生成的 png 文件。

我并不沉迷于这是一个图形解决方案——如果有人可以建议一种替代分析工具(免费或相对便宜)或使用 Doxygen 的 XML 输出来实现相同目标的技术,我会非常高兴。

在文件级别合并的调用者图表确实对客户文档而不是普通列表具有一定的吸引力:-)

0 投票
7 回答
133378 浏览

c - 获取代码的图形化函数调用图的工具

我有一个很大的工作空间,里面有很多 C 代码的源文件。虽然我可以使用对象浏览器在 MS VS2005 中以及在 MSVC 6.0 中看到从函数调用的函数,但这仅在非图形类型的显示中显示从特定函数调用的函数。此外,它没有显示从 say 开始调用main()的函数,然后是从它调用的函数,等等,更深入到叶级函数。

我需要一个工具,它会给我一个带有函数的函数调用图,calleecaller用箭头或类似的东西连接,从main()函数的最后一层开始,或者至少以图形方式显示一个 C 源文件中所有函数的调用图。如果我能打印这张图就好了。

有什么好的工具可以做到这一点(不一定是免费工具)?

0 投票
3 回答
4306 浏览

c - 如何让 gcc 吐出从流程图到源代码行号的映射

给定一个 C 文件,gcc 能否吐出所有发生的函数调用的列表,以及调用本身和函数声明的文件名和行号?

我知道 gcc 以某种方式使用 -g 保留了这些信息(调试器依赖它),并且它可以使用 -dr 转储控制流图(但没有文件名或行号);但是是否有一个现成的工具可以获取 gcc 输出并执行我想要的操作?

我想要这样一个工具来使用 gcc 的原因是,这将允许我将它与大多数基于 gcc 的软件附带的标准构建系统一起使用(例如 ./configure && make),即使在工具依赖于自己的预处理器的情况下也是如此和/或解析器是适应的主要麻烦。我已经知道几个这样的工具,例如ctags。所以这个问题是问题 525899的后续问题。

0 投票
3 回答
1886 浏览

dynamic - 通过 gdb 打印完整的控制流,包括变量的值

这个想法是,给定程序的特定输入,我想以某种方式自动介入整个程序并转储其控制流以及所有正在使用的数据,如类及其变量。他们是一种直接的方法吗?或者这可以通过 gdb 上的一些脚本来完成,还是需要在 gdb 中进行修改?

好的,这个问题的原因是因为关于调试工具的想法。它的作用是这样的。给定程序的两种不同输入,一种导致不正确的输出,另一种导致正确的输出,它将告诉控制流的哪一部分对它们不同。

所以我认为需要将这两个控制流完全转储到差异引擎中。如果这两个输入遵循相似的控制流,那么它们的差异(在许多情况下)会很好地说明为什么存在错误。

这可以成为一个非常吸引人的工具,在此基础上构建了许多功能。

0 投票
7 回答
18254 浏览

dynamic - 如何在 GDB 中自动打印下 N 个执行的行?

一段时间以来,我一直在尝试寻找一种方法来自动化 GDB 中跟踪程序控制流的进度。

甚至只是自动化n命令的一种简单方法,因此您可以查看调用例程的顺序。

我意识到您可以n x在 x 是 GDB 执行的次数的地方提出问题,但问题在于它显示了命令而不是例程的地址!但是如果你n在 GDB 中手动按下(然后按下回车键发出上一个命令)它会显示地址。

我在 GDB 中尝试了以下方法:

GDB 说<breakpoint 1 at 0x123456>。我输入:

但它没有按预期循环,也没有显示地址位置:-(。

任何帮助,将不胜感激!当然,自动记录调用的命令例程一定很简单??

0 投票
8 回答
28757 浏览

c# - C# 调用图生成工具

我刚刚得到一堆(大部分未记录的)C# 代码,我想在深入研究并开始重构之前可视化它的结构。我过去(在其他语言中)使用生成调用图的工具来完成此操作。

你能推荐一个好工具来促进 C# 中结构的发现吗?

更新

除了这里提到的工具,我(通过管道)看到人们说.NET ReflectorCLR Profiler具有此功能。有这些经验吗?

0 投票
2 回答
433 浏览

dependency-injection - 依赖注入:将调用图与构造图分离

我正在尝试练习Dependency Injection 的原则,但我在这样做时遇到了一些困难。

我有一个函数可以定期访问我的数据库,检索产品列表,然后针对这些产品运行一系列测试以确定它们的安全性。

如果发现一种或多种产品不安全,我需要通过实例化和调度ProductRecall对象来发出召回。

该函数看起来像这样:(伪代码)

问题是我在ProductRecall调用图的中间“新建”了一个对象。这违反了依赖注入的原则。如所写,我无法在CheckProductSaftey()不创建ProductRecall对象的情况下进行测试。

但是,我不能将ProductRecall对象传递给我的SafetyInspector对象,因为它SafetyInspector是确定不安全产品列表的人。

我正在对所有内容使用构造函数注入,并且我想继续这样做。另请注意,我可能ProductRecalls随时发出多个,因此我不一定只将单个ProductRecall对象传递给SafetyInspectorat 构造。

有什么建议么?谢谢!

0 投票
3 回答
439 浏览

c++ - 为什么循环摘要在 gprof 的调用图输出中没有任何调用者?

我使用 GNU gprof 2.15.94.0.2.2 对我的 C++ 程序进行分析,该程序的调用周期很大。正如gprof 的文档所示,我希望在调用图输出中看到如下所示的内容:

但是,我<cycle as a whole>的所有条目都没有列出任何来电者。他们都是这样的:

由于我的周期非常大,因此很难在一个周期中通过单个函数跟踪调用者。

谁能告诉我为什么输出中缺少循环调用者,以及如何让它们出现?