Я весьма озадачен. Я не знаю, может ли 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]
-------------------------------------------------------------------------------
И мой вопрос: как я могу получить трассировки стека для отображения в отчете профилирования?
(это немного поздно, но это может помочь кому-то еще)
Поскольку вы выполняете профилирование в режиме таймера (что является поведением по умолчанию на некоторых процессорах), обратная трассировка может быть быть отключенным в вашем ядре (какая версия 2.6.32, поскольку вы находитесь на RHEL 6.2).
Вы можете попробовать:
Я столкнулся с той же проблемой с тем же выпуском ядра, но так как я на ARM, мое быстрое исправление не будет работать
(этот это патч для применения в этом случае).
Других решений пока нет …