Как получить callstack из вывода oprofile?

Я весьма озадачен. Я не знаю, может ли oprofile даже обеспечить трассировку стека из отчета о профилировании. Я просматривал руководство по oprofile, и оно касается только стековых трасс, говоря, что они могут быть зарегистрированы, но это не дает пример того, как это сделать.

Вот мой test.cpp

#include <iostream>
#include <unistd.h>
using namespace std;

void test(){
for (int x = 0; x < 100000; x++) cout << ".";
sleep(1);
cout << endl;
};

int main(int argv, char** argc){
for (int x = 0; x < 120; x++) test();
return 0;
}

Вот команда, которую я использовал для ее компиляции:

g++ -g -Wall test.cpp -o test

И вот мой скрипт perf.sh (работающий на RHEL 6.2 в ВМ):

#!/bin/bash -x
sudo opcontrol --no-vmlinux
sudo opcontrol --reset
sudo opcontrol --start --separate=library,thread --image=$HOME/test
sudo opcontrol --callgraph=10
sudo opcontrol --status
read -p "Press [Enter] key to stop profiling"sudo opcontrol --dump || exit 1
sudo opreport --demangle=smart \
--merge=all \
--symbols \
--callgraph \
--global-percent \
--output-file=perf.out
sudo opcontrol --shutdown
sudo opcontrol --reset

Вот отчет, который я получаю в это время:

CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples  %        app name                 symbol name
-------------------------------------------------------------------------------
14       43.7500  libstdc++.so.6.0.13      /usr/lib64/libstdc++.so.6.0.13
14       43.7500  libstdc++.so.6.0.13      /usr/lib64/libstdc++.so.6.0.13 [self]
-------------------------------------------------------------------------------
11       34.3750  libc-2.12.so             fwrite
11       34.3750  libc-2.12.so             fwrite [self]
-------------------------------------------------------------------------------
5        15.6250  libc-2.12.so             _IO_file_xsputn@@GLIBC_2.2.5
5        15.6250  libc-2.12.so             _IO_file_xsputn@@GLIBC_2.2.5 [self]
-------------------------------------------------------------------------------
2         6.2500  libc-2.12.so             __strlen_sse42
2         6.2500  libc-2.12.so             __strlen_sse42 [self]
-------------------------------------------------------------------------------

И мой вопрос: как я могу получить трассировки стека для отображения в отчете профилирования?

5

Решение

(это немного поздно, но это может помочь кому-то еще)

Поскольку вы выполняете профилирование в режиме таймера (что является поведением по умолчанию на некоторых процессорах), обратная трассировка может быть быть отключенным в вашем ядре (какая версия 2.6.32, поскольку вы находитесь на RHEL 6.2).

Вы можете попробовать:

  1. использовать аппаратные счетчики
  2. посмотри на история части ядра oprofile, если в вашей версии ядра действительно есть ограничения, возможно, это исправлено
  3. обновить ядро

Я столкнулся с той же проблемой с тем же выпуском ядра, но так как я на ARM, мое быстрое исправление не будет работать
(этот это патч для применения в этом случае).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]