2

我正在尝试在 debian 8 jessie 上使用 perf-events 分析一个简单的 C 程序。我可以看到符号,但无法获取堆栈跟踪。相同的过程在 ubuntu 16.04 上生成良好的堆栈跟踪。

我已经安装linux-image-amd64-dbglibc6-dbg. 我已经确认内核配置参数包括CONFIG_KALLSYMS=y

我已经编译了程序gcc -g3 -O0 hello.c以启用调试符号。

我使用以下命令开始分析。 sudo perf record -g ./a.out

我使用以下命令生成火焰图Flame Graph

sudo perf script | ~/code/FlameGraph/stackcollapse-perf.pl | \
~/code/FlameGraph/flamegraph.pl > perf-kernel.svg

这是我要分析的 hello.c 的列表

#include <stdio.h>
#include <unistd.h>


void do2() {
    FILE* f = fopen("/dev/zero", "r");
    int fd = fileno(f);
    char buf[100];
    while(1) {
        read(fd, buf, sizeof(buf)/sizeof(buf[0]));
    }
}

int main(void)
{
    do2();
    return 0;
}

这是 debian jessie 的火焰图

这是 ubuntu 的火焰图

为什么 debian jessie 中缺少堆栈跟踪?

谢谢沙拉特

4

1 回答 1

0

设法找到问题。我必须CONFIG_FRAME_POINTER=y按照Brendan Gregg 的 perf 站点启用并重新编译内核

不幸的是,Debian 8 附带的内核没有启用此功能,这会破坏性能

于 2017-09-27T17:58:21.927 回答