gpt4 book ai didi

c++ - 如何从 oprofile 输出中获取调用堆栈?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:08 27 4
gpt4 key购买 nike

我很困惑。我不知道 oprofile 是否甚至可以提供来自分析报告的堆栈跟踪。我一直在查看 oprofile 手册,它只通过说 they can be logged 来引用堆栈跟踪。 ,但它没有给出如何执行此操作的示例。

这是我的测试.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]
-------------------------------------------------------------------------------

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

最佳答案

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

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

你可以尝试:

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

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

关于c++ - 如何从 oprofile 输出中获取调用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17241844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com