gprof 输出显示不存在的调用图边缘

Posted

技术标签:

【中文标题】gprof 输出显示不存在的调用图边缘【英文标题】:gprof output shows a nonexistent call graph edge 【发布时间】:2019-06-12 18:20:07 【问题描述】:

我有兴趣分析函数grep_source_is_binary()[1],其代码如下:

static int grep_source_is_binary(struct grep_source *gs,
                 struct index_state *istate)

    grep_source_load_driver(gs, istate);
    if (gs->driver->binary != -1)
        return gs->driver->binary;

    if (!grep_source_load(gs))
        return buffer_is_binary(gs->buf, gs->size);

    return 0;

gprof 的调用图为我提供了以下信息:

                0.00    1.58  304254/304254      grep_source_1 [6]
[7]     72.9    0.00    1.58  304254         grep_source_is_binary [7]
                0.01    1.20  304254/304254      show_line_header [8]
                0.00    0.37  303314/607568      grep_source_load [15]

这对我来说似乎很奇怪,因为grep_source_binary() 或其任何子代都没有调用show_line_header()。我是否误解了 gprof 的输出?

[1]:https://github.com/git/git/blob/master/grep.c#L2183

【问题讨论】:

【参考方案1】:

检查您的代码是否正在被编译器优化。如果是,则使用 -O0 禁用它。

【讨论】:

完美!我没有考虑 gcc 优化。使用 -O0 重新编译会得到我期望的分析。

以上是关于gprof 输出显示不存在的调用图边缘的主要内容,如果未能解决你的问题,请参考以下文章

使用gprof显示模板化方法的调用图的参数格式?

gprof 适合分析长时间运行的程序吗?为啥或者为啥不?

显示时使图像边缘透明

如何使用 gprof 分析系统调用?

使用 gprof 和 boost

使用 gprof 分析我的代码时出现不一致