2012-05-12 12 views
12

MacOSX'te bazı C++ programlarını profillemeye çalışıyorum. Bu yüzden google-perftools'u yazdım, MacPorts g ++ 4.7 kullanarak -g derleyici bayrağını kullanarak derlenmiş ve libprofiler'a bağlı bir program yazdım. Sonra koştum: Google Perftools'taki işlemci numarası MacOSX'te işlemci uzmanı

CPUPROFILE=cpu.profile ./a.out 

Sonra çıkış oluşturmak için pprof ran:

perftools isimleri işlev adreslerini dönüştürmeyin gibi görünüyor
[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out. 
Using local file cpu.profile. 
Removing __sigtramp from all stack traces. 
Total: 282 samples 
    107 37.9% 37.9%  107 37.9% 0x000000010d72229e 
     16 5.7% 43.6%  16 5.7% 0x000000010d721a5f 
     12 4.3% 47.9%  12 4.3% 0x000000010d721de8 
     11 3.9% 51.8%  11 3.9% 0x000000010d721a4e 
     9 3.2% 55.0%  9 3.2% 0x000000010d721e13 
     8 2.8% 57.8%  8 2.8% 0x000000010d721a64 
     7 2.5% 60.3%  7 2.5% 0x000000010d7222f0 
     6 2.1% 62.4%  6 2.1% 0x000000010d721a4c 
     6 2.1% 64.5%  6 2.1% 0x000000010d721b1f 
     6 2.1% 66.7%  6 2.1% 0x000000010d721e0c 
     5 1.8% 68.4%  5 1.8% 0x000000010d721fba 
    ...... 

.

Burada nelerin eksik olduğumu bilen var mı? Profilcinin doğru sonucu vermesini sağlamak için ne yapmalıyım?

DÜZENLEME: Daha fazla bilgi: pprof veya google-perftools'un bir sorunu değil, gcc veya macosx gibi bir şeydir, çünkü Instrument.app da satır numaraları yerine adresleri gösterir. Hata ayıklama sembollerinin Mac OS X altında nasıl çalıştığını bilmiyorum. Bu yüzden, gcc veya Mac OS X'de hata yapmak yerine, burada eksik bir şey olarak düşünmeyi tercih ederim. Hata ayıklama bilgilerinin nasıl çalıştığına dair herhangi bir ipucu sunup sunamayacağını merak ediyorum. Mac OS X için

+0

"Bazı C++ programlarını deniyorum" Neden bu soruyu neden C olarak etiketliyorsunuz? –

+0

Bu sorun C++ için değil, aynı zamanda C'ye özgü değildir. –

+0

OS X dev ya da googleperf ile aşina değilim, ancak daha önce libing'i kullanıyorum ve hata ayıklama için -g bayrağı kullanmalıydık. -P bayrağı, profil detaylarını almak için derleyiciye ve bağlayıcıya ekleyin .. – fduff

cevap

4

Bu platformda hata ayıklama sembollerinin .o dosya (ları) içinde kaldığına inanıyorum, bunlar yürütülebilir dosyaya taşınmazlar. Gdb veya profilleyicilerinde sembol almak için .o dosyalarını kaydetmeniz gerekir. Bu, .o dosyalarını korumak için uygulamanızı iki adımda derlemeniz (derleme, ardından bağlantı) yapmanız gerektiği anlamına gelebilir.

Ek bilgi için bkz this question.

pprof Perl kaynak koduna bakarak, sembol adları nm ve c++filt kullanımıyla elde edilir, böylece bağımsız olarak çalıştırmayı ve neden çalışmadıklarını anlamaya çalışabilirsiniz. Pprof kaynağından, nm'nin birkaç versiyonunu kapsayacak bir dizi farklı komut satırı argümanı deniyor gibi görünüyor. Bu,

nm [-D] -n [-f] [--demangle] nesne dosyası yollarının özeti 2>/dev/nul [| cpp + filt]

Köşeli parantez içine koyduğum kısımlar, platformunuz için gerekli olan komut dosyasının çalışma zamanında belirlediği ve nm ve C++ filtrelerinin sürümleridir. Yukarıdakilerin tüm kombinasyonlarını deneyin ve neyin işe yaradığını görün. Sonra pprof komut dosyasının ne işe yaradığını görün, belki de bazı printfs ekleyerek.

İyi şanslar.

+0

Bu yardımcı olmuyor. .o dosyalarını kaydetmeyi denedim ancak pprof hala satır numaraları yerine adres yazdırıyor. –

+0

Sorun pprof değil, bu sembollerin yüklenmesini sağlamak için gdb içinde çalışıyorum, bu size neler olduğuna dair bir fikir verebilir. Belki .o dosyaları beklenenden farklı bir dizinde. – Miguel

+0

Bu konuda bazı ilerlemelerim vardı: eğer programı "CPUPROFILE = cpu.profile gdb./A.out" kullanarak başlatırsam, o zaman "gdb" içinde "başlat" ve "devam et" seçeneğini kullanırsam, sembolleri doğru şekilde alabilirim. Bu yüzden, eğer programı normal olarak başlatırsam sembolleri yüklemeyen google-perftools'un problemi olabilir, bu yüzden 'cpu.profile' içinde kaydedilen adres yanlıştır. Gdb’nin oldukça yavaş ve her seferinde pratik olmaması nedeniyle, programı normalde gdb’yi kullanmadan başlatmam gerekiyor. Peki, nasıl çalışacağım konusunda bir fikrin var mı? Teşekkürler. –

6

Bu benim gperftools sorun izleyicide üzerinde issue #562 bulundum 10.5

OS X tanıtılan address space layout randomization (ASLR) ile ilişkili olduğu görünmektedir. ASLR'yi -Wl,-no_pie'u geçerek devre dışı bırakabilirsiniz.

Ayrıca, gperftools, Instruments (Xcode ile birlikte gelir) kullanmayacaksanız, denemeye değer.

+0

Teşekkürler, bu tam olarak buydu. -Wl, -no_pie Mac OS'de "kutunun dışında" pprof çalışması yapar. – Ogre