2009-06-27 9 views
11

Qualcuno sa dove posso trovare uno strumento di rilevamento perdite di memoria per C++ che può essere eseguito in una riga di comando o come un plug-in Eclipse in Windows e Linux. Mi piacerebbe che fosse facile da usare. Preferibilmente uno che non sovrascrive new(), delete(), malloc() o free(). Qualcosa come GDB se sarà nella riga di comando, ma non ricordo che venga usato per rilevare perdite di memoria. Se esiste un quadro di prova dell'unità che lo fa automaticamente, sarebbe fantastico.G ++ Strumento di rilevamento perdite di memoria multipiattaforma

Questa domanda è simile ad altre domande (ad esempio Memory leak detection under Windows for GNU C/C++) tuttavia ritengo che sia diversa perché chiedono soluzioni specifiche per Windows o dispongono di soluzioni che preferirei evitare. Sento che sto cercando qualcosa di un po 'più specifico qui. I suggerimenti non devono soddisfare tutti i requisiti, ma il maggior numero possibile sarebbe bello.

Grazie. EDIT: Poiché questo è venuto fuori, per "sovrascrivere" intendo tutto ciò che mi richiede di # include una libreria o che altrimenti cambia il modo in cui C++ compila il mio codice, se lo fa in fase di esecuzione in modo che esegua il codice in un ambiente diverso non influirà su nulla che sarebbe bello. Inoltre, sfortunatamente, non ho un Mac, quindi qualsiasi suggerimento per questo non è di aiuto, ma grazie per aver provato. Il mio desktop esegue Windows (ho Linux installato ma i miei due monitor non funzionano con esso) e preferisco non eseguire Linux in una VM, anche se questa è certamente un'opzione. Il mio computer portatile funziona con Linux, quindi posso usare lo strumento lì, anche se preferirei sicuramente attaccare al mio desktop poiché lo spazio dello schermo è eccellente per mantenere tutta la documentazione e i requisiti di progettazione in vista senza dover spostare troppo il desktop .

NOTA: Sebbene possa provare a rispondere, non contrassegnerò uno come accettato finché non avrò provato il suggerimento ed è soddisfacente.

EDIT2: Non sono preoccupato per la compatibilità multipiattaforma del mio codice, si tratta di un'applicazione a riga di comando che utilizza solo le librerie C++.

risposta

10

Valgrind è il tuo best friend. Valgrind ha un plugin per eclissi. "Tristemente" Valgrind non funziona su Windows, ma funziona su Mac OSX, * BSD e Linux, quindi considererei tale "multi-piattaforma". :)

Valgrind "sovrascrive" new/delete/malloc/free ma non durante la compilazione (quindi non è necessario ricompilare se è questo che intendi). Interpreta il binario in modo che le prestazioni subiscano un po 'durante il test.

0

C'è lo strumento leaks su MacOS X (non so se esiste altrove) e ho usato uno strumento chiamato memprof su linux. C'è anche valgrind che funziona su linux ed è incredibilmente fantastico ma ha un notevole impatto sulle prestazioni, e apparentemente su MacOS ma non l'ho provato.

Tuttavia, non sono a conoscenza di tali strumenti su Windows.

1

per applicazioni a 32 bit, valgrind + wine può essere una soluzione di lavoro anche per le app di Windows. Se la tua app può essere eseguita sotto il vino senza alcun cambiamento, quindi eseguirlo sotto valgrind + wine funziona bene nella mia esperienza (abbastanza limitata). Dato che la tua app funziona sotto Linux, direi che probabilmente la tua app verrà eseguita sotto wine (evita codice molto specifico di Windows che non è ancora supportato nel vino).

+0

Intendi ricompilare l'app di Windows su * nix usando Wine come implementazione di api? (sono solo curioso) – olliej

+0

valgrind funziona per x86_64 così come PowerPC, MIPS, ARM e altre architetture. – LiraNuna

+0

No, voglio dire eseguire il tuo binario di Windows, non modificato, su linux sotto il vino stesso sotto valgrind. Ecco perché ho menzionato solo 32 bit: valgrind non può eseguire app sotto wine con supporto a 64 bit, e wine con supporto a 64 bit è sperimentale (da 64 bit, voglio dire applicazioni windows a 64 bit) –

1

Mentre si menziona che non è preferibile, è possibile utilizzare Boehm Garbage Collector per rilevare perdite di memoria. In poche parole, se il garbage collector è effettivamente in esecuzione, in genere si ha una perdita di memoria. È usato in questo modo da Mozilla per rilevare perdite di memoria in Firefox.

1

DUMA è una libreria di rilevamento perdite multipiattaforma che utilizzo per molti dei miei progetti. È bello perché non è necessario #include alcuna intestazione specifica per DUMA, ma basta collegarsi alla libreria prima di collegarsi alla libc del proprio sistema, che contiene le routine di allocazione della memoria e dopo il collegamento in libstdC++.

Può essere un po 'complicato da configurare, soprattutto se utilizzato con progetti C++, ma penso che valga la pena investire il tempo. Mi ha aiutato a trovare alcune perdite di memoria prima che potessi non aver scoperto altrimenti, e un caso in cui ho cancellato due volte un'allocazione.

Una nota: è molto più semplice se si crea un archivio statico (creato per impostazione predefinita su Windows) perché aiuta a ridurre i "falsi positivi" che sono effettivamente causati da interruzioni di funzionamento.

0

Nelle versioni più recenti di gcc c'è qualcosa chiamato disinfettante per perdite. Devi solo aggiungere -fsanitize=leak per compilare il comando. Quindi esegui normalmente il tuo programma e alla fine, se c'è qualche perdita, riceverai un riepilogo (ovviamente nel terminale).

Problemi correlati