私はとても混乱しています。 oprofileがプロファイリングレポートからスタックトレースを提供できるかどうかはわかりません。私はoprofileのマニュアルを見直しており、スタックトレースはthey can be loggedと言っていますが、その方法の例は示されていません。oprofile出力からコールスタックを取得する方法は?
g++ -g -Wall test.cpp -o test
そして、ここに私のperf.shスクリプトが(VMでRHEL 6.2上で実行されている)です。ここで
は私の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;
}
は、ここで私はそれをコンパイルするために使用するコマンドですです。
#!/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 [email protected]@GLIBC_2.2.5
5 15.6250 libc-2.12.so [email protected]@GLIBC_2.2.5 [self]
-------------------------------------------------------------------------------
2 6.2500 libc-2.12.so __strlen_sse42
2 6.2500 libc-2.12.so __strlen_sse42 [self]
-------------------------------------------------------------------------------
私の質問:プロファイリングレポートにスタックトレースが表示されるようにするにはどうすればよいですか?
良い質問です。 docのそのビットはあまり明確ではありません。それはサンプリングの下で無関係なコールカウントを表示しないことをお詫びします。 100%は基本的に2つの部分に分かれているはずです。 'main:12 - > test:8 - > cout :: endl - >' 'main:12 - > test:7 - > sleep - ><システムルーチン> 。私はそれのほとんどが眠っていると思う。私は、あなたが 'stderr'に出力していない限り、' cout << "にはほとんどないだろうと思っています。とにかく、それはGDBのいくつかのスタックショットがあなたに示すものです。 –
うん。 GDBはoprofileよりももう少し役に立ちましたが、私が上で書いたテストスクリプトよりもはるかに大きいマルチスレッドアプリケーションでoprofileを使う必要があることを除けば、だから、GDBを使うことは本当に私のために働くつもりはありません。他の人と話した後、私はロギング+タイマーを使った計器が意味をなさないかもしれないと感じます。 – bitcycle
さて、私がやることは次のとおりです。多くのスレッドのケースでは、中断するとすべてのスレッドが停止しているので、各スレッドに 'bt'を取得します。入力を待つような何もしていないものは無視します。他のものは貴重です。ちょうど測定をするのではなく、コードを高速化する方法を見つけることが目的だと仮定しています。たぶんそれはあなたの目標ではないでしょう。あなたは他の人と話すことができますが、テクニックはそれほどよく知られているわけではないので、あなたが聞くことが期待できるものを知っています。 –