मैं बहुत उलझन में हूं। मुझे नहीं पता कि क्या oprofile एक प्रोफाइलिंग रिपोर्ट से एक स्टैक ट्रेस भी प्रदान कर सकता है। मैं oprofile मैनुअल की समीक्षा किया गया है और यह केवल कि they can be logged कह कर stacktraces को संदर्भित करता है, लेकिन यह ऐसा करने के तरीके के लिए एक उदाहरण देना नहीं है।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 [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]
-------------------------------------------------------------------------------
और, मेरा प्रश्न: मैं प्रोफाइलिंग रिपोर्ट में दिखाने के लिए स्टैक निशान कैसे प्राप्त कर सकता हूं?
अच्छा सवाल। डॉक्टर का वह बिट बहुत स्पष्ट नहीं है। कॉल गणना नहीं दिखाने के लिए माफ़ी मांगना है, जो नमूनाकरण के तहत अप्रासंगिक हैं। आपको मूल रूप से दो भागों में 100% टूटा हुआ देखना चाहिए। एक 'मुख्य होगा: 12 -> टेस्ट: 7 -> नींद -><प्रणाली दिनचर्या>' 'और अन्य मुख्य होगा: 12 -> परीक्षण: 8 -> अदालत :: endl -><प्रणाली आईओ दिनचर्या>' । मुझे संदेह है कि इसमें से ज्यादातर नींद में होंगे। मुझे संदेह है कि 'cout << "में बहुत कम होगा।" जब तक कि आप' stderr' पर आउटपुट नहीं कर रहे थे। वैसे भी, जीडीबी में कई स्टैकशॉट आपको दिखाएंगे। –
हाँ। जीडीबी oprofile की तुलना में थोड़ा अधिक सहायक है, सिवाय इसके कि मुझे एक बहुप्रचारित ऐप में oprofile का उपयोग करने की आवश्यकता है जो मैंने ऊपर लिखी गई टेस्ट स्क्रिप्ट से काफी बड़ी है। तो, जीडीबी का उपयोग वास्तव में मेरे लिए काम नहीं करेगा। दूसरों के साथ बात करने के बाद, मुझे लॉगिंग का उपयोग करने के लिए उपकरण की तरह लग रहा है + टाइमर अधिक समझ में आ सकता है। – bitcycle
ठीक है, यहाँ मैं क्या कर सकता है: कई धागा मामले में, जब मैं इसमें बाधा डालते हैं, हर धागा रोक दिया जाता है, तो मैं प्रत्येक थ्रेड पर एक 'bt' मिलता है। जो कुछ भी नहीं कर रहे हैं, जैसे इनपुट की प्रतीक्षा करना, मैं अनदेखा करता हूं। अन्य मूल्यवान हैं। मुझे लगता है कि लक्ष्य को मापने के तरीकों के रूप में कोड को तेजी से बनाने के तरीकों को ढूंढना है। शायद यह आपका लक्ष्य नहीं है। आप दूसरों से बात कर सकते हैं, लेकिन यह तकनीक उतनी अच्छी तरह से ज्ञात नहीं है जितना होना चाहिए, इसलिए आप जानते हैं कि आप क्या सुन सकते हैं। –