使用 valgrind / callgrind 运行我的程序时,我经常收到以下消息:
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(地址不同)
请注意,它前面没有堆栈溢出消息。
我找不到有关此消息的任何文档,而且我不知道究竟是什么溢出。
任何人都可以帮我找出问题所在吗?这是 valgrind 的问题,还是我的程序的问题?
valgrind 源代码中的第 1327 行指向用户手册,“请参阅用户手册中的限制部分”:
在 Linux 上,Valgrind 在启动时使用 RLIMIT_DATA rlim_cur 确定“brk 段”的大小,最小为 1 MB,最大为 8 MB。每次程序尝试将 brk 段扩展到超出启动时确定的大小时,Valgrind 都会输出一条消息。大多数程序都可以在这个限制下正常工作,通常是通过切换到使用 mmap 来获得更多内存。如果您的程序确实需要一个大的 brk 段,您必须更改 8 MB 硬编码限制并重新编译 Valgrind。
Valgrind 只为 brk 段分配了 8MB,而这个段用完了。有人报告说 libc 然后在讨论此问题的valgrind 错误报告中切换到基于 mmap 的内存分配。
虽然这不是一个真正的答案,但它仍然满足 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 段溢出”到底是什么意思”给出合格答案的人!
添加到 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 段大小
这是 valgrind 的问题,还是我的程序的问题?
我不确定原因,但我认为你可以忽略它。至少似乎可以通过法律程序触发它。我在这里用一个例子回答了一个类似/重复的问题: