2016-02-01 15 views
32

Quando si esegue il mio programma con valgrind/callgrind ottengo il seguente messaggio molto:Valgrind segnalare un overflow di segmento

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (con diversi indirizzi)

Nota che non è preceduto da un messaggio di overflow dello stack .

Non riesco a trovare alcuna documentazione su questo messaggio e non ho idea di cosa straripi esattamente.

Qualcuno può aiutarmi a capire qual è il problema? È un problema di valgrind o del mio programma?

+2

[BRK] (http://man7.org/linux/man-pages/man2/brk.2.html) è una chiamata di sistema che alloca la memoria per un processo modificando la dimensione del segmento di dati. La mancata crescita del segmento dati implica per me che questo errore riguarda la memoria che si sta esaurendo. Ma non sono sicuro. – user2079303

+0

Ciò causa il fallimento del programma? – Archimaredes

+0

@Archimaredes Se ho ragione, il programma viene eseguito normalmente - sebbene callgrind lo renda terribilmente lento. –

risposta

4

Anche se questo non è davvero una risposta, soddisfa ancora del PO "non poteva trovare nessuna documentazione" requisito:

1) http://repo.or.cz/valgrind.git/blob/HEAD:/coregrind/m_syswrap/syswrap-generic.c

contiene il messaggio discusso in linea 1322

2) http://sourceforge.net/p/valgrind/mailman/message/34068401/

è il commit che ha introdotto la funzione, e il messaggio corrispondente commettere legge

Author: florian 
Date: Wed Apr 29 13:59:16 2015 
New Revision: 15155 

Log: Issue an error message if then brk segment overflows. 

da cui possiamo inoltrare ulteriormente questa domanda a coloro che possono dare una risposta qualificata a "cosa fa esattamente" che un segmento brk trabocca "significa in questo contesto"!

1

Si tratta di un problema di valgrind o del mio programma?

Non sono sicuro del motivo, ma penso che tu possa ignorarlo. Almeno sembra essere possibile attivarlo con i programmi legali. Mi risponde una simile/dublicate con un esempio qui:

Valgrind reporting "brk segment overflow in thread #1"

6

Valgrind assegna solo 8 MB per il segmento brk, che si esaurisce. Uno riporta che libc sta quindi passando ad una allocazione di memoria basata su mmap nel valgrind bugreport discutendo di questo.

16

Linea 1327 dalle valgrind source code punti al manuale d'uso, "vedere la sezione Limitazioni nel manuale utente":

Limits section item 1:

Su Linux, Valgrind determina all'avvio la dimensione del 'segmento brk' utilizzando RLIMIT_DATA rlim_cur, con un minimo di 1 MB e un massimo di 8 MB. Valgrind emette un messaggio ogni volta che un programma tenta di estendere il segmento brk oltre la dimensione determinata all'avvio. La maggior parte dei programmi funzionerà correttamente con questo limite, in genere passando all'utilizzo di mmap per ottenere più memoria. Se il tuo programma ha davvero bisogno di un grosso segmento brk, devi modificare il limite di 8 MB hardcoded e ricompilare Valgrind.

+2

Qualcuno ha trovato dove modificare questo limite codificato per ricompilare? Anche quali sono i valori ragionevoli per cambiarlo? – Plazgoth

2

In aggiunta alla risposta di Piwi, a volte il programma richiede che Callgrind utilizzi un segmento di brk più grande (fino a GB, a seconda dell'implementazione).

Per modificare il limite hardcoded, andare alla funzione VG_(ii_create_image) in coregrind/m_initimg/initimg-linux.c (intorno alla linea 1000), cambiare le seguenti righe in base alle proprie esigenze

SizeT m1 = 1024 * 1024; 
SizeT m8 = 8 * m1; 

e ricostruire Valgrind.

m8 è la dimensione del segmento massimo BRK che callgrind cercherà di allocare

+0

Mi sono imbattuto nello stesso errore. L'approccio sopra non funziona. Segifica o segnala l'errore del segmento brk. – Sandeep