Как получить родительские вызовы для символов libc6 (например, _int_malloc) с помощью linux perf?

Я профилирую приложение C++, используя linux perf, и получаю хороший граф потока управления, используя GProf2dot. Однако некоторые символы из библиотеки C (libc6-2.13.so) занимают значительную часть общего времени и при этом не имеют внутренних ребер.

Например:

  • _int_mallocзанимает 8% времени, но не имеет родительских вызовов.
  • __strcmp_sse42и __cxxabiv1::__si_class_type_info::__do_dyncastвместе занимают около 10% времени и имеют вызывающий объект с именем 0, у которого есть вызывающие абоненты 2d6935c, 2cc748cи 6, у которых нет вызывающих абонентов.

В результате я не могу выяснить, какие подпрограммы ответственны за все это выделение памяти и динамическое приведение, используя только perf. Однако кажется, что другие символы (например, malloc, но не _int_malloc) имеют родительские вызовы.

Почему perf show не вызывает родителей для _int_malloc? Почему я не могу найти конечных пользователей __do_dyn_cast? И есть ли способ изменить мои настройки, чтобы я мог получить эту информацию? Я на x86-64, поэтому мне интересно, нужна ли мне (нестандартная) libc6 с указателями кадров.

7
задан osgx 18 August 2012 в 01:29
поделиться