Çok kafam karıştı. Oprofile, bir profil raporundan bir yığın izi bile sağlayabilir mi bilmiyorum. Oprofile el kitabını inceledim ve yalnızca they can be logged olduğunu söyleyerek stacktraces'i ifade eder, ancak bunun nasıl yapılacağına dair bir örnek vermez. Burada (bir VM RHEL 6.2 üzerinde çalışan) benim perf.sh senaryo,Oprofile çıkışından nasıl bir çağrı alırım?
g++ -g -Wall test.cpp -o test
Ve:
İşte İşte benim 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;
}
var bunu derlemek için kullanılan komut var: İşte
#!/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
Ben şu anda, alıyorum raporu:
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]
-------------------------------------------------------------------------------
Ve, sorum: Profil oluşturma raporunda görünecek yığın izlerini nasıl alabilirim?
İyi soru. Bu doktor biraz açık değil. Örnekleme altında ilgisiz olan çağrı sayılarını göstermediğinden özür diliyor. Temel olarak iki parçaya bölünmüş% 100 görmelisiniz. Biri ana: 12 -> test: 7 -> uyku -> ve diğeri "ana: 12 -> test: 8 -> cout :: endl -> . Bunun çoğunun uykuda olacağından şüpheleniyorum. Ben çok az "cout <<" olurdu şüpheleniyorum. "' Stderr 'çıktısını almadıkça. Her neyse, GDB'deki birkaç yığının size gösterdiği şey bu. –
Evet. GDB, yukarıda yazdığım test komut dosyasından çok daha büyük olan çok iş parçacıklı bir uygulamada oprofile kullanmam gerektiğinden, oprofile göre biraz daha yararlı oldu. Yani, GDB kullanmak benim için gerçekten işe yaramıyor. Başkalarıyla konuştuktan sonra, günlüğe kaydetme + zamanlayıcılar kullanarak enstrüman yapmayı daha çok mantıklı bulabilirim. – bitcycle
Eh, burada yapacağım şey: birçok iş parçacığı durumunda, onu keserken, her iş parçacığı durdurulur, böylece her iş parçacığında bir 'bt' aldım. Hiçbir şey yapmayanlar, girdi beklemek gibi, görmezden gelirim. Diğerleri değerlidir. Hedefin, sadece ölçümler almak yerine, kodu daha hızlı hale getirmenin yollarını bulmak olduğunu varsayıyorum. Belki bu senin amacın değil. Başkalarıyla konuşabilirsin, ama teknik olması gerektiği kadar iyi bilinmese de, ne duymayı bekleyeceğini biliyorsun. –