当使用valgrind / callgrind运行我的程序时,我经常收到以下消息:==21734== brk segment overflow in thread #1: can't grow to 0x4a39000(不同地址)请注意,它之前没有堆栈溢出消息。我找不到关于这条消息的任何文档,我也不知道到底是什么溢出。有谁能帮我找出问题所在吗?这是Valgrind的问题,还是我的程序的问题?
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
chhkpiq41#
valgrind source code的第1327行指向用户手册,“参见用户手册中的限制部分”:限值章节第1项:在Linux上,Valgrind在启动时使用RLIMIT_DATA rlim_cur确定“brk段”的大小,最小为1 MB,最大为8 MB。Valgrind在每次程序试图扩展brk段超过启动时确定的大小时输出一条消息。大多数程序都能在这个限制下正常工作,通常是通过切换到使用mmap来获得更多内存。如果你的程序真的需要一个很大的brk段,你必须改变8MB的硬编码限制并重新编译Valgrind。
vhipe2zx2#
Valgrind只为brk段分配了8MB,该段已耗尽。有人报告说,libc随后在valgrind bugreport中切换到基于mmap的内存分配。
gzszwxb43#
虽然这不是一个真正的答案,但它仍然满足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段溢出到底意味着什么”!
5lhxktic4#
除了Piwi的答案之外,有时您的程序将需要Callgrind使用更大的brk段(高达GB,取决于您的实现)。要修改硬编码的限制,请转到coregrind/m_initimg/initimg-linux.c中的函数VG_(ii_create_image)(第1000行附近),根据需要更改以下行
coregrind/m_initimg/initimg-linux.c
VG_(ii_create_image)
//-------------------------------------------------------------- // Setup client data (brk) segment. Initially a 1-page segment // which abuts a shrinkable reservation. // p: load_client() [for 'info' and hence VG_(brk_base)] //-------------------------------------------------------------- { SizeT m1 = 1024 * 1024; SizeT m8 = 8 * m1; SizeT dseg_max_size = (SizeT)VG_(client_rlimit_data).rlim_cur; VG_(debugLog)(1, "initimg", "Setup client data (brk) segment\n"); if (dseg_max_size < m1) dseg_max_size = m1; if (dseg_max_size > m8) dseg_max_size = m8; dseg_max_size = VG_PGROUNDUP(dseg_max_size); setup_client_dataseg( dseg_max_size ); }
重建Valgrindm8是callgrind尝试分配的最大brk段大小FreeBSD和Solaris有类似的代码,但macOS没有。
m8
mzaanser5#
这是Valgrind的问题,还是我的程序的问题?我不知道原因,但我想你可以忽略它。至少似乎有可能通过法律程序触发它。我用一个例子回答了类似的问题:Valgrind报告“线程#1中的brk段溢出”
5条答案
按热度按时间chhkpiq41#
valgrind source code的第1327行指向用户手册,“参见用户手册中的限制部分”:
限值章节第1项:
在Linux上,Valgrind在启动时使用RLIMIT_DATA rlim_cur确定“brk段”的大小,最小为1 MB,最大为8 MB。Valgrind在每次程序试图扩展brk段超过启动时确定的大小时输出一条消息。大多数程序都能在这个限制下正常工作,通常是通过切换到使用mmap来获得更多内存。如果你的程序真的需要一个很大的brk段,你必须改变8MB的硬编码限制并重新编译Valgrind。
vhipe2zx2#
Valgrind只为brk段分配了8MB,该段已耗尽。有人报告说,libc随后在valgrind bugreport中切换到基于mmap的内存分配。
gzszwxb43#
虽然这不是一个真正的答案,但它仍然满足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/
是引入该功能的提交,相应的提交消息为
从这里,我们可以进一步把这个问题转达给那些能够给予一个有条件的答案的人,“在这种情况下,brk段溢出到底意味着什么”!
5lhxktic4#
除了Piwi的答案之外,有时您的程序将需要Callgrind使用更大的brk段(高达GB,取决于您的实现)。
要修改硬编码的限制,请转到
coregrind/m_initimg/initimg-linux.c
中的函数VG_(ii_create_image)
(第1000行附近),根据需要更改以下行重建Valgrind
m8
是callgrind尝试分配的最大brk段大小FreeBSD和Solaris有类似的代码,但macOS没有。
mzaanser5#
这是Valgrind的问题,还是我的程序的问题?
我不知道原因,但我想你可以忽略它。至少似乎有可能通过法律程序触发它。我用一个例子回答了类似的问题:
Valgrind报告“线程#1中的brk段溢出”