2012-06-28 7 views
15

Corro Valgrind con i seguenti parametri:Come ottenere lo stack completo di chiamate da Valgrind?

--leak-check=full --show-reachable=yes --leak-resolution=high --num-callers=100 --trace-children=yes 

In perdite di memoria di registro, vedo alcuni messaggi di errore con stack completo traccia fino a principale, ma alcuni messaggi sembro seguente:

==3956== 1,999,140 (68,796 direct, 1,930,344 indirect) bytes in 5,733 blocks are definitely lost in loss record 8,842 of 8,845 
==3956== at 0x4022AB8: malloc (vg_replace_malloc.c:207) 
==3956== 

Come posso ottenere la traccia dello stack completo per questi errori?

+0

L'ultima versione rilasciata di Valgrind supporta solo --num-chiamanti fino a 50. Pertanto, non è chiaro quale versione si sta utilizzando. La traccia dello stack di cui sopra sembra incompleta. Questo potrebbe essere collegato al modo in cui la tua applicazione è compilata (ad esempio l'opzione -fomit-frame-pointer potrebbe rendere la traccia dello stack più difficile da produrre) – phd

+0

Bump. (i messaggi "bump" di stackoverflow?) Lo stesso problema. Compilare un'applicazione con -g. Mostra possibili perdite di memoria con una traccia stack che inizia da malloc(), la funzione che si chiama malloc(), quindi main(), saltando tutto ciò che si trova in mezzo, incluse le funzioni all'interno dello stesso file di main(). ?? Vedo esempi online che non hanno questo limite di frame di 3 stack .. ?? Qualche idea? – Samuel

+0

Sto usando valgrind 3.8.1 su Ubuntu 13.10 e vedo tracce dello stack che non contengono tutte le chiamate intermedie. Nessuna ottimizzazione durante la compilazione con gcc (o forse ho bisogno di -Og o qualcosa del genere ...) – thoni56

risposta

14

Per ottenere la traccia dello stack completo sono necessari i simboli di debug per tutte le librerie/file eseguibili che potrebbero essere coinvolti in una perdita (e nei limiti stabiliti da --num-callers).

Se stai costruendo qualcuno di loro da solo, devi specificare il flag -g in gcc (o il flag relativo in qualsiasi altro compilatore).

Nota che non è infallibile, e può occasionalmente perdere perdite o essere in grado di fornire le tracce stack completo (specialmente se si sta utilizzando thread, o complicate class implementazioni).

Per le librerie senza informazioni di debug, la traccia dello stack si fermerà in quella libreria.

Per uno strumento gratuito, è molto buono in quello che fa, ma c'è un motivo per cui IBM può vendere i profili di memoria per grandi somme.

+6

Grazie, nel mio caso ho dovuto semplicemente regolare l'opzione --num-callers. Il valore predefinito sembra essere 12, che è piuttosto basso per l'STL e simili. – cib