2011-09-02 4 views
6

Motivazione: non riesco a ottenere google cpu profiler per lavorare sulla macchina in cui il codice viene eseguito (con il mio ultimo respiro maledico libunwind :)), quindi Mi chiedevo se il gdb supporta la sospensione casuale ad alta frequenza dell'esecuzione del programma, memorizzando il nome della funzione in cui si è verificata l'interruzione e contando quante volte è stato messo in pausa nella funzione x. Questo è quello che chiamerei "campionamento del tempo di esecuzione", probabilmente c'è un nome più preciso/più intelligente. Ho guardato l'oprofile, ma è da complicato per a) capire se può farlo b) per capire come farlo EDIT: a quanto pare il nome corretto è: "metodo di campionamento statistico"GDB supporta "campionamento del tempo di esecuzione" oppure esiste un'estensione utente che lo fa

EDIT2 : motivo per cui offro una taglia per questo è che vedo un ppl su SO consigliare di fare un'interruzione manuale 10-20x ed esaminare lo stack con bt ... Sembra molto dispendioso quando si tratta di tempo, quindi mi piace qualche ppl intelligente automatizzato . :) EDIT3: gprof non lo taglia ... ho provato a farlo funzionare di recente sul sistema ARM e l'output era spazzatura ... :(Immagino che i problemi con il multithreading siano la ragione ...

+0

Il campionamento manuale sembra inutile se non lo si è provato. Vedi 1 ° commento [* qui *] (http://stackoverflow.com/a/893272/23771). Ultimo paragrafo di [* questa risposta *] (http://stackoverflow.com/a/4832698/23771). [* Questa risposta. *] (Http://stackoverflow.com/a/317160/23771) [* Questa risposta. *] (Http://stackoverflow.com/a/2474118/23771) Il commento di [* ErikE qui *] (http://stackoverflow.com/a/378024/23771). Il commento di codelidoo [* qui *] (http://stackoverflow.com/a/3097542/23771). Provalo, poi deprecarlo. –

risposta

2

Puoi campionare manualmente in GDB mettendo in pausa in fase di esecuzione.

Cosa ti sembra di pensare che si vuole è gprof, ma se il tuo obiettivo è quello di rendere il programma il più velocemente possibile, poi vorrei suggerire

  • L'alta frequenza del campionamento non è utile

  • Il conteggio del numero di campioni in cui il contatore del programma è in funzione X non è utile tranne nei programmi artificialmente piccoli.

Se segui quel link, vedrai i motivi per cui e le istruzioni su come farlo con successo.

+1

L'alta frequenza del campionamento senza dover compilare con i flag gprof sarebbe utile. – rogerdpack

+0

@rogerdpack: In realtà non la penso così, come per * [questo collegamento] (http://scicomp.stackexchange.com/a/1870/1262) *. Forse è un po 'troppo impegnativo, ma se qualcosa richiede abbastanza tempo per essere corretto, lo vedrai in 10 campioni. Gli altri 990 campioni non ti dicono altro. In realtà ti dicono meno, perché riassumono tutte le intuizioni che ti dicono cosa sta succedendo. –

+0

Ok, vedo nel tuo link: http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux che elenca gli altri strumenti che possono essere utili come lsstack, oprofile, ecc. Grazie! Vedi anche la mia risposta, che elenca ciò che ho trovato dei profiler del campionamento: http://stackoverflow.com/a/11143125/32453 – rogerdpack

2

GDB non lo farebbe bene, anche se potreste certamente modificare qualcosa che ha dato risultati poco accurati.

Suggerirei il plug-in "Callgrind" di Valgrind. Come bonus non richiede assolutamente alcuna ricompilazione o altre impostazioni speciali. Tutto ciò di cui hai bisogno è valgrind installato nel tuo sistema, e fai il debug di informazioni nel tuo programma (o, almeno, informazioni complete sui simboli; non ne sono sicuro).

È quindi richiama il vostro programma come questo:

valgrind --tool=callgrind <your program command line> 

Quando è fatto ci sarà un nome di file callgrind.out.<pid> nella directory corrente. È possibile leggere e visualizzare questo file con uno strumento GUI molto bello chiamato kcachegrind (in genere è necessario installarlo separatamente).

L'unico problema è che, poiché callgrind rallenta leggermente l'esecuzione del programma, il tempo trascorso nelle chiamate di sistema può apparire più piccolo (in termini percentuali) di quanto sarebbe in realtà. Per impostazione predefinita, callgrind non include il tempo di sistema nei suoi contatori, quindi i valori che fornisce sono un confronto reale del codice nel programma, se non l'ora effettiva "sotto" quella funzione. Questo può essere fonte di confusione, in un primo momento, quindi se ciò accade, prova ad aggiungere --collect-systime=yes.

Non sono sicuro di quale potrebbe essere lo stato di callgrind su ARM. ARMv7 è listed as a supported platform, ma dice solo "abbastanza completo", qualunque cosa significhi.

+0

idk se il valgrind è l'opzione dato che non ho scritto il codice e l'IDK se dipende da alcuni timeout ... aka cancel se x non si è verificato entro 200 ms dalla richiesta di x. :) – NoSenseEtAl

+0

Viene eseguito più lentamente, su x86_64, ma comunque con una velocità abbastanza rispettabile. Non posso parlare per ARM. Dai, non ci vuole molto sforzo. – ams

+0

wait, is valgrind slowdown 10 + x? E non posso provarlo solo perché il target HW non ha valgrind o connessione internet. Nemmeno GCC. Semplicemente fantastico GDB. :) – NoSenseEtAl

Problemi correlati