Valgrind报告了一个段溢出

Tim*_*ers 45 c++ valgrind overflow callgrind

当用valgrind/callgrind运行我的程序时,我得到以下消息:

==21734== brk segment overflow in thread #1: can't grow to 0x4a39000 (使用不同的地址)

请注意,它之前没有堆栈溢出消息.

我找不到关于此消息的任何文档,我不知道究竟是什么溢出.

任何人都可以帮我弄清问题是什么?这是valgrind或我的程序的问题吗?

小智 22

valgrind源代码中的第1327行指向用户手册,"请参阅用户手册中的限制"部分:

限制第1项:

在Linux上,Valgrind使用RLIMIT_DATA rlim_cur在启动时确定'brk段'的大小,最小值为1 MB,最大值为8 MB.每当程序试图将brk段扩展到超出启动时确定的大小时,Valgrind就会输出一条消息.大多数程序都可以正常使用此限制,通常是通过切换到使用mmap来获取更多内存.如果您的程序确实需要大型brk段,则必须更改8 MB硬编码限制并重新编译Valgrind.

  • 有没有人发现在哪里更改这个硬编码限制重新编译?还有什么是合理的价值来改变它? (3认同)
  • 我仍然不明白 brk 段是什么,我仍然不知道这是否意味着我的程序或 valgrind 或我的计算机的功能有问题。 (2认同)

syl*_*eux 9

Valgrind只为brk段分配8MB,用完了.有人报告说,libc然后在讨论这个问题的valgrind bugreport中切换到基于mmap的内存分配.

  • 因此,更具体一点:如果您的应用程序在 Linux 上运行并使用常用的 C `malloc()` 函数和/或 C++ `new` 运算符进行内存分配,则可以安全地忽略此 valgrind 消息,因为 malloc 库将自动切换到`mmap()`。如果您使用自己的分配器,仅支持 `brk()` / `cbrk()`,那么向该分配器添加 `mmap()` 支持可能仍然比重新编译 valgrind 更容易。 (5认同)

iks*_*nov 6

虽然这不是一个真正的答案,但它仍然满足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.
Run Code Online (Sandbox Code Playgroud)

从那里我们可以进一步将这个问题转发给那些能够给出一个合格的答案的人,"brk段溢出"到底是什么意思"在这种情况下意味着"!


小智 5

添加到 Piwi 的答案中,有时您的程序将要求 Callgrind 使用更大的 brk 段(最多 GB,具体取决于您的实现)。

要修改硬编码限制,请转到(第 1000 行左右)中的函数VG_(ii_create_image)coregrind/m_initimg/initimg-linux.c根据需要更改以下几行

SizeT m1 = 1024 * 1024;
SizeT m8 = 8 * m1;
Run Code Online (Sandbox Code Playgroud)

并重建valgrind。

m8 是 callgrind 将尝试分配的最大 brk 段大小

  • 我确实将其更改为 SizeT m8 = 100 * m1,重新编译,重新安装,它实际上有助于消除错误消息(使用 valgrind 3.13.0 进行测试)。请注意,在 valgrind 3.16.1 中它是 m16 而不是 m8。 (3认同)