2012-11-27 13 views
10

Sto sviluppando un'applicazione C++ a 64 bit collegata in modo statico su CentOS a 64 bit a 64 bit utilizzando i pacchetti standard gcc 4.4 dai repository CentOS. Sembra che stia usando più memoria di quanto mi aspettassi, quindi ho provato a usare massif per sagomare l'utilizzo della memoria. Ho compilato con le informazioni di debug e quindi eseguireLo strumento massiccio di Valgrind non profilerà la mia applicazione

valgrind --tool = massiccio ./MyProg

dalla directory in cui risiede MyProg. Non produce mai risultati diversi dal seguente esempio massif.out.XXXX.

desc: (none) 
cmd: ./MyProg 
time_unit: i 
#----------- 
snapshot=0 
#----------- 
time=0 
mem_heap_B=0 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 

Si noti che questo è l'intero contenuto del file e il mio programma può funzionare per molti minuti.

Ho provato varie opzioni per valgrind e massif senza esito. Ho anche provato a utilizzare il percorso assoluto per MyProg, per ogni evenienza. Ho provato a scaricare la versione stabile più recente di valgrind (3.8.1) e a compilarla ed eseguirla (dato che CentOS utilizza 3.5.0) con lo stesso risultato. Come un controllo di integrità correvo

valgrind --tool = ls -l massiccio

e produsse più istantanee agli usi non-zero memoria, come previsto.

Ho provato a cercare online utilizzando tutte le combinazioni di parole chiave a cui potevo pensare ma non ho riscontrato problemi simili.

Come nota a margine, posso profilare correttamente l'applicazione utilizzando lo strumento di memcheck predefinito di valgrind, nel caso in cui si tratti di informazioni utili.

Qualcuno sa perché il massiccio non riuscirebbe a profilare la mia domanda?

+0

Il programma è collegato staticamente? Se fai un 'ldd./MyProg', elenca un sacco di librerie condivise, o non stampa nulla? –

+0

È collegato staticamente. Ho modificato la domanda per chiarire questo. – Tyson

risposta

9

Se l'applicazione è collegata in modo statico, non può essere analizzata utilizzando valgrind. Valgrind funziona fornendo la propria versione delle funzioni di allocazione al programma, che esegue ignorando la ricerca dinamica.

Se è possibile collegarsi dinamicamente alle librerie standard (libc e libstdC++), dovrebbe probabilmente essere in grado di eseguire l'analisi della memoria che si sta cercando.

Dal Valgrind FAQ:

In secondo luogo, se il programma è collegato in modo statico, la maggior parte degli strumenti di Valgrind non funziona così, perché non saranno in grado di sostituire alcune funzioni, come malloc, con la loro proprie versioni.

+0

Grazie. Ho perso quella parte delle FAQ. Dopo aver cambiato il collegamento dinamico parziale, sono in grado di ottenere un profilo. – Tyson

+0

Sulla base di una [conversazione] (http://thread.gmane.org/gmane.comp.debugging.valgrind/12653) sulla mailing list di valgrind-users, valgrind dovrebbe essere in grado di analizzare le applicazioni collegate staticamente dalla versione 3.8.1 sopra. Come richiesto sulla mailing list ho archiviato un [bug] (https://bugs.kde.org/show_bug.cgi?id=311093) a riguardo. – Tyson

Problemi correlati