2016-02-01 13 views
32

Po uruchomieniu programu z valgrind/callgrind otrzymuję następujący komunikat dużo:Valgrind raportowania przepełnienie segmentu

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (o różnych adresach)

pamiętać, że nie jest poprzedzone komunikatem przepełnienie stosu .

Nie mogę znaleźć żadnej dokumentacji tego komunikatu i nie mam pojęcia, co dokładnie przepełnia się.

Czy ktoś może mi pomóc ustalić, na czym polega problem? Czy to jest problem z valgrind, czy z mojego programu?

+2

[BRK] (http://man7.org/linux/man-pages/man2/brk.2.html) jest połączeniem systemu przydziela pamięć dla procesu, zmieniając rozmiar segmentu danych. Niepowodzenie w segmencie danych oznacza dla mnie, że ten błąd dotyczy wyczerpania pamięci. Ale nie jestem pewien. – user2079303

+0

Czy to powoduje awarię programu? – Archimaredes

+0

@Archimaredes Jeśli mam rację, program uruchamia się normalnie - chociaż wywołanie wywołuje powolny postęp. –

Odpowiedz

4

Choć nie jest to odpowiedź, że nadal spełnia OP "nie można znaleźć żadnych docs" wymóg:

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

zawiera komunikat omówione w linii 1322

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

jest popełnić że wprowadzono funkcję, a odpowiadający popełnić wiadomość czyta

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

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

skąd możemy przekazać to pytanie dalej tym, którzy mogą udzielić kompetentnej odpowiedzi na pytanie "co dokładnie robi", w tym kontekście "segment brk" oznacza "!

1

Czy to jest problem z valgrind, czy z mojego programu?

Nie jestem pewien powodu, ale myślę, że można go zignorować. Przynajmniej wydaje się, że można go uruchomić za pomocą legalnych programów. Odpowiedziałem podobny/dublicate z przykładu tutaj:

Valgrind reporting "brk segment overflow in thread #1"

6

Valgrind tylko przydziela 8MB dla segmentu BRK, która biegnie na zewnątrz. Jedna z nich zgłasza, że ​​libc przełącza się na alokację pamięci opartą na mmap w dyskursie valgrind bugreport.

16

Linia 1327 od valgrind source code punktów w instrukcji obsługi „patrz ograniczenia sekcji w instrukcji”:

Limits section item 1:

na Linuksie, Valgrind określa przy starcie rozmiaru „segmentu BRK” przy użyciu RLIMIT_DATA rlim_cur, o minimalnej wielkości 1 MB i maksymalnie 8 MB. Valgrind wysyła komunikat za każdym razem, gdy program próbuje rozszerzyć segment brk poza rozmiar określony podczas uruchamiania. Większość programów będzie działała prawidłowo z tym limitem, zwykle przechodząc na użycie mmap, aby uzyskać więcej pamięci. Jeśli twój program naprawdę potrzebuje dużego segmentu brk, musisz zmienić limit zakodowany na 8 MB i przekompilować Valgrind.

+2

Czy ktoś znalazł miejsce, w którym można zmienić ten zakodowany limit, aby przekompilować? Jakie są rozsądne wartości, aby je zmienić? – Plazgoth

2

Dodając do odpowiedzi Piwi, czasami twój program będzie wymagał Callgrind, aby użyć większego segmentu brk (do GB, w zależności od implementacji).

Aby zmodyfikować Hardcoded limitu, przejdź do funkcji VG_(ii_create_image) w coregrind/m_initimg/initimg-linux.c (około 1000 linii), zmień następujące linie w zależności od potrzeb

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

i odbudować valgrind.

m8 jest maksymalna wielkość segmentu BRK że callgrind spróbuje przydzielić

+0

Wystąpił ten sam błąd. Powyższe podejście nie działa. Uszkadza lub zgłasza błąd segmentu brk. – Sandeep