2010-10-25 11 views
5

Ho provato a eseguire valgrind (memcheck e massif) su un'app che ho scritto, ma tutto ciò che ottengo sono gli indirizzi per le funzioni eseguite.Valgrind non restituirà le linee di origine!

--------------------------------- 
Context accounted for 0.6% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x8141740: (within prog_name) 

Called from: 
    0.6% : 0x812E077: (within prog_name) 

--------------------------------- 
Context accounted for 0.5% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x81418FB: (within prog_name) 

Called from: 
    0.5% : 0x812E077: (within prog_name) 

ho compilato la mia app con la bandiera -g di mettere i simboli di debug in. C'è qualche altra ragione per cui valgrind non avrebbe mostrato la linea di origine?

MODIFICA: versione di valgrind 3.2.1-Debian; g ++ 4.3.1

+1

Non è sicuro, ma se tu 'gdb prog_name' la tua app e prova qualcosa come' break 0x812E077', gdb' mostra i numeri di riga? (Non dovresti nemmeno "eseguire" il programma, devi solo gdb! Caricarlo.) – aschepler

+0

@aschepler - Provato. Ogni volta che provo a farlo, gdb non riesce a trovare la funzione denominata "0x812E077" e chiede se è in una libreria che verrà caricata in seguito ... quindi non ha funzionato. –

+1

Whoops, che avrebbe dovuto essere 'break * 0x812E077'. Ma felice che tu abbia trovato una soluzione. – aschepler

risposta

8

ho scoperto che ho passato in entrambe le -g e -ggdb bandiere per g++ in fase di compilazione. Omettendo il flag -g questo problema si è risolto.

1

Immagino che non si stiano citando i giusti flag e che si utilizzino i flag di default.

--show-reachable è uno di questi flag che deve essere abilitato, vedere gli altri flag e abilitarli.

--Cheers

2

ci sono un paio di possibili motivi:

  • si può avere inavvertitamente messo a nudo la tua eseguibile (spiegazione più probabile),
  • si può essere l'esecuzione di codice JITted (se l'indirizzo non sembra che sia il caso).

Cosa dice file prog_name? Se dice "spogliato", questo è un problema. Potresti anche voler controllare se altri strumenti, ad es. GDB sa che il simbolo è all'indirizzo 0x805F29A:

gdb prog_name 
(gdb) info symbol 0x805F29A 
+0

Non ho mai ricevuto un messaggio spogliato. Non lo so per certo, ma sospetto che mischiare le bandiere '-g' e '-ggdb' lo abbia incasinato. –

+0

@sheepsimulator Puoi sospettare tutto ciò che vuoi, ma se vuoi che ti aiutiamo, ti preghiamo di fornire le informazioni che chiediamo: cosa * esattamente * fa 'file prog_name' dire? cosa dice esattamente GDB "simbolo informativo"? –

+0

Apprezzo il tuo show di supporto, ma questo problema è andato via quando ho omesso il flag -g al momento della compilazione. Considero la mia domanda risposta. –

1

Per altri lettori con problemi simili (ho avuto lo stesso, ma le mie opzioni compilatore dove ok): Si scopre che valgrind ha bisogno il percorso del file eseguibile, se si non dare questo allora funzionerà bene ma non ti darà i numeri di linea. Nel mio caso l'eseguibile era in una directory diversa, che era nel mio cammino, ma per ottenere le informazioni linea Ho dovuto correre

valgrind --leak-check = full path_to_myprogram/myprogram

Problemi correlati