Почему при использовании gperftools я вижу ребра в графе вызовов, которых не существует?

Учитывая следующий код, который либо вызывает f, либо g

#include <stdlib.h>
#include <stdio.h>

int f() {
    return 0;
}

int g() {
    return 1;
}

int main() {
    long sum = 0;
    for(int i = 0; i < 1000*1000*1000; i++) {
        int result;
        if(rand() % 2 == 0) {
            result = f();
        }
        else {
            result = g();
        }

        sum += result;
    }
    printf("%ld\n", sum);
}

я компилирую с

g++ test.c -o doom -lprofiler -lunwind

И беги с

CPUPROFILE=./test.txt ./test

А затем создайте gif с помощью

pprof --gif ./test ./test.txt > output.gif

Я получаю следующее: введите здесь описание изображения

Однако у меня есть ребра, идущие от f к g, от f к самому себе и от g к самому себе. Включенных оптимизаций нет (и я попробовал еще раз с -O0, чтобы убедиться), а также пробовал с -lunwind и без него.

Почему профайлер считает, что f вызывает g (и иногда саму себя)? Как правильно использовать профайлер?


person archgoon    schedule 10.07.2014    source источник
comment
Известная проблема (нет ответа)   -  person n. 1.8e9-where's-my-share m.    schedule 10.07.2014
comment
Ребра f‹-›g больше не отображаются в текущей версии (используя git HEAD)   -  person Michael Schubert    schedule 10.10.2015
comment
Да, в последней выпущенной версии этой проблемы больше нет.   -  person Aliaksei Kandratsenka    schedule 11.10.2015