7

我很混乱。我不知道 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 脚本(在 VM 中的 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]                
-------------------------------------------------------------------------------   

而且,我的问题是:如何让堆栈跟踪显示在分析报告中?

4

1 回答 1

1

(这有点晚了,但这可能对其他人有帮助)

因为您在计时器模式下进行分析(这是某些 CPU 上的默认行为),所以您的内核中可能会禁用回溯(该版本似乎是 2.6.32,因为您使用的是 RHEL 6.2)。

您可以尝试:

  1. 使用硬件计数器
  2. 查看oprofile 内核部分的历史,如果您的内核版本确实存在限制,则可能已修复
  3. 更新你的内核

我在相同的内核版本中遇到了同样的问题,但由于我在 ARM 上,我的快速修复将不起作用(是在这种情况下应用的补丁)。

于 2014-01-15T16:02:44.710 回答