为什么KCacheGrind不显示我的函数名称?

时间:2019-05-04 15:45:42

标签: c++ c debugging trace call-graph

我正在尝试使用kcachegrind生成一个调用图,最好清楚地表明调用图中的哪些块与我的功能相对应。我按照this answer进行了测试,得到了不同的输出。我不知道要重复此示例的结果需要做什么。 如何让kcachegrind在调用图上显示函数名称?

为方便起见,这是我使用的确切代码:

int f2(int i) { return i + 2; }
int f1(int i) { return f2(2) + i + 1; }
int f0(int i) { return f1(1) + f2(2); }
int pointed(int i) { return i; }
int not_called(int i) { return 0; }

int main(int argc, char **argv) {
    int (*f)(int);
    f0(1);
    f1(1);
    f = pointed;
    if (argc == 1)
        f(1);
    if (argc == 2)
        not_called(1);
    return 0;
}

该文件(main.c)的编译方式如下:

gcc -ggdb3 -O0 -std=c99 main.c -o main

然后我调用valgrind:

valgrind --tool=callgrind ./main

其输出以下内容:

==4770== Callgrind, a call-graph generating cache profiler
==4770== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al.
==4770== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==4770== Command: ./main
==4770== 
==4770== For interactive control, run 'callgrind_control -h'.
==4770== 
==4770== Events    : Ir
==4770== Collected : 121502
==4770== 
==4770== I   refs:      121,502

最后,我用输出文件(callgrind.out.4789)启动了kcachegrind:

kcachegrind callgrind.out.4789

在我使用的示例中,我希望调用图看起来像这样:

The Expected Graph Output

相反,我得到的东西看起来像这样:

The Actual Graph Output

我该怎么做才能在调用图上显示函数名称?

1 个答案:

答案 0 :(得分:0)

根据@ user6556709的评论,加载程序和动态链接在上面的图形输出中显示。引用的示例未指示如何找到您的主文件,但可以在GUI的“平面配置文件”部分中找到:

Digging for programs

需要花一些时间才能找到它-可以按源进行分组以仅显示.c / .h文件,也可以使用“位置”标题按位置名称排序并搜索主文件。