Что означает «куча»?

Что означает «В файле [куча]»?

Это означает, что sysprof считает, что функция была вызвана откуда-то из кучи программ (область, где память выделяет malloc), а не из раздела кода (где обычно находится исполняемый код). Этому есть несколько возможных объяснений.

Компиляторы JIT («на лету»)

Такие языки, как Java, могут генерировать исполняемый код во время работы программы и сохранять его в куче. В этом случае Sysprof точно сообщает об этом.

Компиляторы с оптимизацией

Компиляторы C и C++ могут оптимизировать информацию, необходимую для определения источника вызова функции, поэтому определение источника из [кучи] является ошибочным. Вы по-прежнему можете определить, как часто каждая функция вызывается программой, но не всегда откуда.

В gcc флаг -fno-omit-frame-pointer отключает эту оптимизацию. Он нужен не всегда, например на архитектуре x86_64 он нужен только с оптимизацией -O3.

Чтобы получить наиболее подробное и точное дерево вызовов из неоптимизированного кода, используйте следующие флаги: -ggdb -fno-omit-frame-pointer -O0