web-dev-qa-db-fra.com

Valgrind signale un débordement de segment

Lorsque j'exécute mon programme avec valgrind/callgrind, j'obtiens souvent le message suivant:

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (avec différentes adresses)

Notez qu'il n'est pas précédé d'un message de dépassement de pile.

Je ne trouve aucune documentation sur ce message et je n'ai aucune idée de ce qui déborde exactement.

Quelqu'un peut-il m'aider à comprendre quel est le problème? Est-ce un problème de valgrind ou de mon programme?

43
Tim Kuipers

La ligne 1327 du code source valgrind pointe vers le manuel de l'utilisateur, "voir la section Limitations du manuel de l'utilisateur":

Limite l'article 1 de la section:

Sous Linux, Valgrind détermine au démarrage la taille du 'segment brk' en utilisant le RLIMIT_DATA rlim_cur, avec un minimum de 1 Mo et un maximum de 8 Mo. Valgrind génère un message chaque fois qu'un programme essaie d'étendre le segment brk au-delà de la taille déterminée au démarrage. La plupart des programmes fonctionneront correctement avec cette limite, généralement en passant à l'utilisation de mmap pour obtenir plus de mémoire. Si votre programme a vraiment besoin d'un gros segment brk, vous devez modifier la limite codée en dur de 8 Mo et recompiler Valgrind.

20
Piwi

Valgrind alloue seulement 8 Mo pour le segment brk, qui s'épuise. On signale que libc passe alors à une allocation de mémoire basée sur mmap dans le valgrind bugreport en discutant.

9
sylvain.joyeux

Bien que ce ne soit pas vraiment une réponse, cela répond toujours à l'exigence "n'a trouvé aucun document" de l'OP:

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

contient le message discuté à la ligne 1322

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

est le commit qui a introduit la fonctionnalité, et le message de commit correspondant lit

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

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

d'où nous pouvons relayer cette question à ceux qui peuvent donner une réponse qualifiée à "ce que signifie exactement" un débordement de segment brk "signifie dans ce contexte"!

6
iksemyonov

Pour ajouter à la réponse de Piwi, votre programme nécessitera parfois que Callgrind utilise un segment brk plus grand (jusqu'à Go, selon votre implémentation).

Pour modifier la limite codée en dur, accédez à la fonction VG_(ii_create_image) dans coregrind/m_initimg/initimg-linux.c (vers la ligne 1000), modifiez les lignes suivantes selon vos besoins

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

et reconstruire valgrind.

m8 est la taille maximale du segment brk que callgrind tentera d'allouer

3
Fimbres

Est-ce un problème de valgrind ou de mon programme?

Je ne suis pas sûr de la raison, mais je pense que vous pouvez l'ignorer. Au moins, il semble possible de le déclencher avec des programmes juridiques. J'ai répondu un similaire/en double avec un exemple ici:

Valgrind signale "débordement de segment brk dans le thread # 1"

1
Thorbjørn Martsum