使 callgrind 显示 kcachegrind 调用图中的所有函数调用

Posted

技术标签:

【中文标题】使 callgrind 显示 kcachegrind 调用图中的所有函数调用【英文标题】:Make callgrind show all function calls in the kcachegrind callgraph 【发布时间】:2016-02-19 13:19:15 【问题描述】:

我正在使用 valgrind 工具 - callgrind 和 kcachegrind 来分析一个大型项目,并且想知道是否有一种方法可以让 callgrind 报告所有函数(不仅仅是最昂贵的函数)的统计信息。

具体来说——当我在 kcachegrind 中可视化调用图时,它只包含那些非常昂贵的函数,但我想知道是否有办法将项目中的所有函数都包含在调用图中。用于生成分析信息的命令如下:

valgrind --dsymutil=yes --tool=callgrind $EXE 

我不确定是否必须为 valgrind 提供任何选项,或者可能以不同的优化方式编译应用程序。这可能是微不足道的,但我找不到解决方案。对此高度赞赏的任何指针。

谢谢!

【问题讨论】:

Kcachegrind 将隐藏权重较小的函数(可以通过主菜单更改一些限制 - 设置 - 例如列表中的项目数;一些 - 使用图形选项卡上的上下文菜单)。你也可以试试callgrind_annotate没有限制的控制台工具。 【参考方案1】:

昨天我突然想到了。如图,我在kcachegrind的调用图中发现,有一个右键菜单,在里面可以设置节点可视化的阈值。

还有一个选项“无最小值”,但不能选择。我想可能是因为,如果每个函数,不管它多么微不足道,都占用一个节点,那么图可能太大而无法处理。

我刚刚发现脚本gprof2dot 可以处理这个问题。 该脚本可以将 callgrind 的输出转换为点,可以将其可视化为图形。该脚本有两个相关参数:

-n PERCENTAGE, --node-thres=PERCENTAGE 消除低于此阈值的节点 [默认值:0.5]。为了可视化图中的所有节点,您可以设置-n0之类的参数 -e PERCENTAGE--edge-thres=PERCENTAGE消除低于此阈值的边缘 [默认值:0.1]。为了可视化图中的所有边,您可以设置像-e0这样的参数

为了生成完整的调用图,您将使用这两个选项(-n0-e0)。

我已经尝试过了,但是,由于生成的图形太大,点软件警告我“图形对于 cairo-renderer 位图来说太大了。按 0.328976 缩放以适应。”但是您可以设置输出格式为 eps 可以处理这个问题。您还可以更改参数以适应您的目标。

示例

假设您有一个名为 callgrind.out.1992 的 callgrind 输出文件。要生成完整的调用图,您将使用:

gprof2dot.py -n0 -e0 ./callgrind.out.1992 -f callgrind

要生成图形的PNG 输出图像,您可以运行以下命令:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind > out.dot

dot -Tpng out.dot -o out.png

现在您有一个带有完整图表的out.png 图像。

注意使用-f 参数来指定配置文件格式(在我们的例子中为callgrind)。

【讨论】:

【参考方案2】:

我将使用可让您生成完整调用图的信息来完成 rengar 的回答,并提供完整过程的示例。

您可以使用gprof2dot 在调用图中显示所有函数。该脚本可以将 callgrind 的输出转换为dot,可以将其可视化为图形。该脚本有两个相关参数:

-n PERCENTAGE, --node-thres=PERCENTAGE 消除低于此阈值的节点 [默认值:0.5]。为了可视化图表中的所有节点,您应该将此参数设置为-n0 -e PERCENTAGE--edge-thres=PERCENTAGE消除低于此阈值的边缘 [默认值:0.1]。为了可视化图表中的所有边,您应该将此参数设置为-e0

为了生成完整的调用图,您可以使用以下两个选项:-n0-e0

示例

假设您有一个名为 callgrind.out.1992 的 callgrind 输出文件。要生成完整的调用图,您将使用:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind

要生成图形的 PNG 输出图像,您可以运行以下命令:

gprof2dot -n0 -e0 ./callgrind.out.1992 -f callgrind > out.dot

dot -Tpng out.dot -o out.png

现在您有一个带有完整图表的out.png 图像。

注意使用-f 参数来指定配置文件格式(在我们的例子中为callgrind)。

【讨论】:

【参考方案3】:

我使用的命令是 valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes $EXE,据我所知,它包含调用图中的所有函数。

希望对你有帮助。

【讨论】:

以上是关于使 callgrind 显示 kcachegrind 调用图中的所有函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Kcachegrind 理解 callgrind 的输出

kcachegrind 无法打开 callgrind 文件

解释 callgrind 数据

callgrind 配置文件输出与回溯?

在简单的 R 文件上运行 Callgrind

使用 callgrind/kcachegrind 获取每个线程的统计信息