瓦尔格林德报告段溢出

Valgrind reporting a segment overflow

本文关键字:溢出 段溢出 报告 林德      更新时间:2023-10-16

当使用 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 段溢出"