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 输出显示不存在的调用图边缘的主要内容,如果未能解决你的问题,请参考以下文章