当用valgrind / callgrind运行我的程序时,我得到以下消息:
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(使用不同的地址)
请注意,它之前没有堆栈溢出消息。
我无法找到有关此消息的任何文档,我不知道到底有什么溢出。
有人能帮我弄清问题是什么吗?这是valgrind或我的程序的问题吗?
答案 0 :(得分:17)
第1327行从valgrind source code点到用户手册,“请参阅用户手册中的限制”:
在Linux上,Valgrind使用RLIMIT_DATA rlim_cur在启动时确定'brk段'的大小,最小值为1 MB,最大值为8 MB。每当程序试图将brk段扩展到超出启动时确定的大小时,Valgrind就会输出一条消息。大多数程序都可以正常使用此限制,通常是通过切换到使用mmap来获取更多内存。如果您的程序确实需要大型brk段,则必须更改8 MB硬编码限制并重新编译Valgrind。
答案 1 :(得分:8)
Valgrind只为brk段分配8MB,但是用完了。有人报告说,libc正在valgrind bugreport讨论这个问题时切换到基于mmap的内存分配。
答案 2 :(得分:5)
虽然这不是一个真正的答案,但它仍然满足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段溢出的”究竟是什么“在这种情况下意味着”!
答案 3 :(得分:2)
添加到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段大小
答案 4 :(得分:1)
这是valgrind或我的程序的问题吗?
我不确定原因,但我认为你可以忽略它。至少似乎有可能通过合法程序触发它。我在这里回答了一个类似/道德的例子: