54

使用 valgrind / callgrind 运行我的程序时,我经常收到以下消息:

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (地址不同)

请注意,它前面没有堆栈溢出消息。

我找不到有关此消息的任何文档,而且我不知道究竟是什么溢出。

任何人都可以帮我找出问题所在吗?这是 valgrind 的问题,还是我的程序的问题?

4

5 回答 5

25

valgrind 源代码中的第 1327 行指向用户手册,“请参阅用户手册中的限制部分”:

限制部分第 1 项:

在 Linux 上,Valgrind 在启动时使用 RLIMIT_DATA rlim_cur 确定“brk 段”的大小,最小为 1 MB,最大为 8 MB。每次程序尝试将 brk 段扩展到超出启动时确定的大小时,Valgrind 都会输出一条消息。大多数程序都可以在这个限制下正常工作,通常是通过切换到使用 mmap 来获得更多内存。如果您的程序确实需要一个大的 brk 段,您必须更改 8 MB 硬编码限制并重新编译 Valgrind。

于 2016-10-27T13:27:19.563 回答
12

Valgrind 只为 brk 段分配了 8MB,而这个段用完了。有人报告说 libc 然后在讨论此问题的valgrind 错误报告中切换到基于 mmap 的内存分配。

于 2016-09-22T15:45:05.693 回答
8

虽然这不是一个真正的答案,但它仍然满足 OP 的“找不到任何文档”的要求:

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 段溢出”到底是什么意思”给出合格答案的人!

于 2016-02-01T12:16:35.183 回答
5

添加到 Piwi 的答案中,有时您的程序将需要 Callgrind 使用更大的 brk 段(最多 GB,具体取决于您的实现)。

要修改硬编码限制,请转到函数VG_(ii_create_image)coregrind/m_initimg/initimg-linux.c大约第 1000 行),根据需要更改以下行

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

并重建 valgrind。

m8是 callgrind 将尝试分配的最大 brk 段大小

于 2017-08-31T01:15:53.110 回答
2

这是 valgrind 的问题,还是我的程序的问题?

我不确定原因,但我认为你可以忽略它。至少似乎可以通过法律程序触发它。我在这里用一个例子回答了一个类似/重复的问题:

Valgrind 报告“线程 #1 中的 brk 段溢出”

于 2016-03-27T15:10:54.703 回答