瓦尔格林德报告段溢出
Valgrind reporting a segment overflow
当使用 valgrind/callgrind 运行我的程序时,我经常收到以下消息:
==21734== brk segment overflow in thread #1: can't grow to 0x4a39000
(地址不同)
请注意,它前面没有堆栈溢出消息。
我找不到有关此消息的任何文档,也不知道究竟是什么溢出了。
谁能帮我弄清楚问题是什么?这是瓦尔格林德的问题,还是我的程序的问题?
valgrind源代码中的第1327行指向用户手册,"请参阅用户手册中的限制部分":
限制部分第 1 项:
在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,取决于你的实现)。
要修改硬编码限制,请转到 coregrind/m_initimg/initimg-linux.c
中的函数VG_(ii_create_image)
(第 1000 行左右),根据需要更改以下行
//--------------------------------------------------------------
// 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) segmentn");
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 );
}
并重建瓦尔格林德。
m8
是调用格林德将尝试分配的最大 brk 段大小
FreeBSD 和 Solaris 也有类似的代码段,但 macOS 没有。
这是瓦尔格林德的问题,还是我的程序的问题?
我不确定原因,但我认为你可以忽略它。至少似乎可以通过法律程序触发它。我在这里用一个例子回答了一个类似/重复的问题:
瓦尔格林德报告"线程 #1 中的 brk 段溢出"
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 使用 strcat 获取缓冲区溢出错误
- LeetCode 1:两和 - 地址清理器:堆缓冲区溢出地址
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- C++ 对象数组堆栈溢出
- 使用提升::lexical_cast捕获溢出
- C++ Unordered_set功能中的溢出
- 自定义排序函数中的堆溢出
- 使用向量的缓冲区溢出
- 不能在Unorderd地图中通过溢出的溢出
- 无符号位字段的溢出是否保证环绕
- 瓦尔格林德报告段溢出