2012-05-12 7 views
12

Sto provando a profilare alcuni programmi C++ su MacOSX. Così ho creato google-perftools, scritto un programma, compilato usando MacPorts g ++ 4.7, con il flag del compilatore -g e collegato a libprofiler. Poi mi sono imbattuto:Numero di riga nel profiler della CPU di Google Perftools su MacOSX

CPUPROFILE=cpu.profile ./a.out 

Poi pprof mi corse per generare l'output:

[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 
    ...... 

Sembra che i perftools non convertono gli indirizzi di funzionare nomi.

Qualcuno sa cosa mi manca qui? Cosa devo fare per consentire al profiler di generare il risultato corretto.

MODIFICA: Ulteriori informazioni: non è un problema di pprof o di google-perftools, ma più qualcosa come gcc o macosx, perché Instrument.app mostra anche gli indirizzi invece dei numeri di riga. Non ho familiarità con il modo in cui i simboli di debug funzionano con Mac OS X, quindi preferisco pensare che manchi qualcosa qui, invece di essere bug in gcc o Mac OS X. Mi chiedo se qualcuno possa fornire alcuni suggerimenti su come funziona il debug per Mac OS X.

+0

"Sto provando il profilo di alcuni programmi C++" Allora perché tagga questa domanda come C? –

+0

Questo problema non è specifico per C++ ma anche per C. –

+0

Non ho familiarità con OS X dev né googleperf, ma in I ho usato profiling libs prima, e oltre al flag -g per il debug, abbiamo dovuto aggiungi il flag -p al compilatore e al linker per ottenere i dettagli di profilazione. – fduff

risposta

4

Credo che in questa piattaforma i simboli di debug rimangano nei file .o, non vengano spostati nell'eseguibile. Per ottenere simboli in gdb o profiler è necessario salvare i file .o. Ciò potrebbe significare che è necessario compilare la domanda in due passaggi (compilare, quindi collegare) per conservare i file .o.

Vedere this question per ulteriori informazioni.

Osservando il codice sorgente di pprof Perl, i nomi dei simboli sono ottenuti tramite l'uso di nm e c++filt, in modo da poter provare a eseguire quelli autonomi e capire perché non funzionano. Dal sorgente pprof sembra che provi un sacco di argomenti a riga di comando diversi per coprire diverse versioni di nm. Questo è un riassunto dei modi

nm [-D] -n [-f] [--demangle] oggetto-file 2>/dev/nul [| cpp + filt]

Le parti che ho messo tra parentesi sono quelle che lo script determina in fase di runtime se sono necessarie per la propria piattaforma e le versioni di nm e C++ filt. Prova tutte le combinazioni di sopra e guarda cosa funziona. Quindi guarda cosa fa lo script pprof, magari aggiungendo alcuni printfs.

Buona fortuna.

+0

Non aiuta. Ho provato a salvare i file .o ma pprof stampa ancora l'indirizzo anziché i numeri di riga. –

+0

Il problema non è pprof, lavorerei in gdb per far caricare questi simboli, che potrebbe darti un'idea di cosa sta succedendo. Forse i file .o sono in una directory diversa dal previsto. – Miguel

+0

Ho avuto qualche progresso su questo: se avvio il programma usando 'CPUPROFILE = cpu.profile gdb./A.out', quindi' start' e 'cont' dentro' gdb', posso ottenere i simboli correttamente. Quindi suppongo che potrebbe essere il problema di google-perftools che non carica i simboli se avvio il programma normalmente, in modo che l'indirizzo registrato all'interno di 'cpu.profile' non sia corretto. Dato che 'gdb' è piuttosto lento e non pratico da eseguire ogni volta, ho davvero bisogno di avviare il programma normalmente senza' gdb'. Quindi hai idea di come posso farlo funzionare? Grazie. –

6

Questo sembra essere legato alla ASLR (ASLR) introdotta in OS X 10.5

ho depositato issue #562 sul tracker gperftools problema. È possibile disabilitare ASLR passando -Wl,-no_pie.

Inoltre, se non si è obbligati a utilizzare gperftools, Instruments (fornito con Xcode) vale la pena provare.

+0

Grazie, era esattamente così. -Wl, -no_pie rende il lavoro pprof "out of the box" su Mac OS. – Ogre

Problemi correlati