Valgrind сообщает о переполнении сегмента

Когда я запускаю свою программу с помощью valgrind / callgrind, я часто получаю следующее сообщение:

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(с разными адресами)

Обратите внимание, что ему не предшествует сообщение о переполнении стека.

Я не могу найти никакой документации по этому сообщению, и я понятия не имею, что именно переполнено.

Кто-нибудь может мне помочь разобраться в чем проблема? Это проблема valgrind или моей программы?

40

Решение

Линия 1327 от исходный код valgrind указывает на руководство пользователя, «см. раздел Ограничения в руководстве пользователя»:

Ограничение раздела пункт 1:

В Linux Valgrind определяет при запуске размер сегмента brk, используя RLIMIT_DATA rlim_cur, с минимальным размером 1 МБ и максимальным 8 МБ. Valgrind выводит сообщение каждый раз, когда программа пытается расширить сегмент brk сверх размера, определенного при запуске. Большинство программ будут правильно работать с этим ограничением, обычно переключаясь на использование mmap, чтобы получить больше памяти. Если вашей программе действительно нужен большой сегмент brk, вы должны изменить жестко заданный лимит 8 МБ и перекомпилировать Valgrind.

17

Другие решения

Valgrind выделяет только 8 МБ для сегмента brk, который заканчивается. Один сообщает, что libc затем переключается на распределение памяти на основе mmap в Valgrind Bugreport обсуждая это.

8

Хотя на самом деле это не ответ, он все же удовлетворяет требованию ОП «не удалось найти документы»:

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

содержит сообщение, обсуждаемое в строке 1322

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

это коммит, который представил функцию, и соответствующее сообщение коммита читает

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

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

откуда мы можем далее передать этот вопрос тем, кто может дать квалифицированный ответ на вопрос «что именно означает« переполнение сегмента brk »в этом контексте»!

5

В дополнение к ответу Piwi, иногда вашей программе потребуется Callgrind, чтобы использовать больший сегмент brk (до GB, в зависимости от вашей реализации).

Чтобы изменить жестко заданный предел, перейдите к функции VG_(ii_create_image) в coregrind/m_initimg/initimg-linux.c (около строки 1000), измените следующие строки в соответствии с вашими потребностями

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

и восстановить Вальгринд.

m8 максимальный размер сегмента brk, который callgrind попытается выделить

2

Это проблема valgrind или моей программы?

Я не уверен в причине, но я думаю, что вы можете игнорировать это. По крайней мере, представляется возможным запустить его с помощью легальных программ. Я ответил на аналогичный / пример с примером здесь:

Отчет Valgrind "Переполнение сегмента brk в потоке # 1"

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector