如何使用一些分析信息获取程序的调用图

Posted

技术标签:

【中文标题】如何使用一些分析信息获取程序的调用图【英文标题】:How to get the call graph of a program with a bit of profiling information 【发布时间】:2010-03-13 17:27:39 【问题描述】:

我想了解给我的 C++ 程序是如何工作的,以及它花费最多时间的地方。

为此,我尝试先使用gprof,然后使用gprof2dot 来获取图片,但结果有时有点难看。

你通常是怎么做的?你能推荐更好的替代品吗?

P.D.哪些是开源解决方案(最好适用于 Linux 或 Mac OS)X?

【问题讨论】:

你能解释一下你所说的“丑陋”是什么意思吗?您是反对有效的内容还是只是布局? 布局,我按照第一个例子。信息还可以,但显示方式不太好;我的意思是,我得到一张尺寸为 20(宽度)x 2(高度)的图片。不能在报告中使用 如果你想要一个报告,你为什么要画一个图表? 我想在报告中添加一些数字,其中一些数字包含调用图。我认为这并不罕见 【参考方案1】:

Linux 上的 OProfile 运行良好,实际上我比 GProf 更喜欢它。有几个图形工具可以帮助可视化 OProfile 输出。

【讨论】:

【参考方案2】:

你可以试试KCachegrind。这是一个可视化由名为 Callgrind 的Valgrind 工具获取的样本的程序。 KCachegrind 似乎没有得到积极维护,但他生成的图表非常有用。

【讨论】:

您能否提供一个链接,说明如何在使用 kcachegrind 之前从 valgrind 获取调用图信息?谢谢 试试valgrind ­­tool=callgrind <executable>。有一些选项可以调整您的结果,通常使用的包括­­dump­instr=yes ­­trace­jump=yes。然后开始kcachegrind 阅读统计数据并玩得开心:-)。 HTH【参考方案3】:

我认为有两种选择(在 Windows 上):

分析器更改应用程序的组装指令(称为检测)并记录每个细节。这些分析器往往很慢(应用程序运行速度慢约 10 倍),有时难以设置,而且通常不是免费的,但它们为您提供了与性能相关的最佳信息。如果您需要这种类型的分析器,请查找“Ration Quantity”、“AQTime”和“Performance Validator”。 分析器不检测应用程序,而只是查看正在运行的应用程序并收集它的“样本”。这些分析器速度很快(没有性能损失),通常易于设置,您可以找到一些免费的替代品。如果您想要这种类型的分析器,请查找“非常困”和“Luke Stackwalker”。

虽然我过去使用过 Rational Quantity 和 AQTime 等商业分析器,并且对结果非常满意,但我发现缺点(难以设置、无法解释的崩溃、性能缓慢)超过了优点。

因此我切换到免费替代品,此时我主要使用“非常困”。

【讨论】:

【参考方案4】:

如果您想查看应用程序的结构(谁调用了什么、引用、调用树等),请查看“了解 C/C++”。此应用程序会调查您的源代码,并允许您从应用程序的结构中查询几乎所有内容。

【讨论】:

对不起,我的意思是开源应用程序,谢谢【参考方案5】:

请参阅SD C++ Profiler。

此处的其他答案表明,面向探针的分析器的开销很高(10 倍)。这个没有。

【讨论】:

【参考方案6】:

Same answer as ---

编辑:@Steve 建议我给出一个不那么简洁的答案。

我一直都在听到这句话——“我想知道我的程序在哪里花费了时间”。 让我建议另一种措辞 - “我想找出为什么我的程序会花费时间”。

也许区别并不明显。 当一个程序执行一条指令时,它这样做的原因为什么被编码在程序的整个状态中,包括调用堆栈。 只看程序计数器就像试图通过分析车轮的旋转角度来判断是否需要乘坐出租车。 您需要查看程序的整个状态。

我经常听到另一个神话 - 您需要测量方法的执行时间,以找到“慢”的方法。 有很多方法可以让程序花费比他们需要的更多的时间,比如在某些方法中进行线性搜索而不是二分搜索,这可能是人们想到的那种事情。

思考方式是这样的:

不只是一件事花费了不必要的时间。可能有好几个。 每件事情都需要一些时间,比如 10%、50%、90% 或一些这样的数字。这意味着,如果挂钟可以在这段时间内停止,那么整个应用程序所花费的时间就会减少多少。 你想知道那些东西是什么,不管它们是什么。 Profilers(采样器)通过获取大量浅样本(PC 或调用堆栈)并对其进行汇总以获取测量值来工作。但是测量不是您需要的。您需要的是从时间的角度了解它在做什么。最好获取少量样本,例如 10 或 20 个,然后检查(而不是总结)它们。如果某些活动花费了 20%、50% 或 90% 的时间,那么这就是您在每个样本的行为中捕获它的概率,因此这大致是您将看到它的样本的百分比。重要的是找出它是什么,而不是准确衡量无关紧要的东西。

因此,作为一种从时间角度查看程序正在做什么的方式,here's how many people do it

【讨论】:

以上是关于如何使用一些分析信息获取程序的调用图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

如何使用工具进行C/C++的内存泄漏检测

如何跟踪和分析 mod_perl 或 mod_php 应用程序使用的所有低级调用(c 库)?

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

如何使用 Python websockets 库获取“ping”调用的“pong”响应?

如何从社交媒体获取数据以使用机器学习对其进行分析?