Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Valgrind报告段溢出_C++_Overflow_Valgrind_Callgrind - Fatal编程技术网

C++ Valgrind报告段溢出

C++ Valgrind报告段溢出,c++,overflow,valgrind,callgrind,C++,Overflow,Valgrind,Callgrind,使用valgrind/callgrind运行程序时,我经常收到以下消息: ==21734==brk段在线程中溢出#1:无法增长到0x4a39000 (地址不同) 请注意,它前面没有堆栈溢出消息 我找不到关于这条消息的任何文档,也不知道到底是什么溢出了 有人能帮我找出问题出在哪里吗?这是valgrind的问题还是我的程序的问题?虽然这不是一个真正的答案,但它仍然满足OP的“找不到任何文档”要求: (一) 包含第1322行讨论的消息 (二) 是引入该功能的提交,相应的提交消息读取 Author: f

使用valgrind/callgrind运行程序时,我经常收到以下消息:

==21734==brk段在线程中溢出#1:无法增长到0x4a39000
(地址不同)

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

我找不到关于这条消息的任何文档,也不知道到底是什么溢出了


有人能帮我找出问题出在哪里吗?这是valgrind的问题还是我的程序的问题?

虽然这不是一个真正的答案,但它仍然满足OP的“找不到任何文档”要求:

(一)

包含第1322行讨论的消息

(二)

是引入该功能的提交,相应的提交消息读取

Author: florian
Date: Wed Apr 29 13:59:16 2015
New Revision: 15155

Log: Issue an error message if then brk segment overflows.
从这里,我们可以进一步将这个问题传递给那些能够给出“brk段溢出”在这种情况下的确切含义”的合格答案的人

这是valgrind的问题还是我的程序的问题

我不确定原因,但我认为你可以忽略它。至少,似乎有可能通过法律程序来触发它。我用一个例子回答了一个类似的问题:


Valgrind仅为brk段分配8MB,该段已用完。有人报告说,在讨论这一点时,libc正在切换到基于mmap的内存分配。

用户手册要点第1327行,“请参阅用户手册中的限制部分”:

在Linux上,Valgrind在启动时使用RLIMIT_数据rlim_cur确定“brk段”的大小,最小值为1 MB,最大值为8 MB。每次程序试图将brk段扩展到启动时确定的大小之外时,Valgrind都会输出一条消息。大多数程序都会在这个限制下正常工作,通常是通过切换到使用mmap来获得更多内存。如果你的程序真的需要一个大的brk段,你必须改变8MB的硬编码限制并重新编译


除了Piwi的回答之外,有时您的程序将要求Callgrind使用更大的brk段(高达GB,取决于您的实现)

要修改硬编码限制,请转到
corefrind/m\u initimg/initimg linux.c
中的函数
VG(ii\u创建\u图像)
(第1000行左右),根据需要更改以下几行

SizeT m1 = 1024 * 1024;
SizeT m8 = 8 * m1;
重建瓦尔格林


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

是通过更改数据段大小为进程分配内存的系统调用。未能增长数据段对我来说意味着,此错误与内存耗尽有关。但我不确定。这会导致你的程序失败吗?@Archimaredes如果我是对的,程序会正常执行——尽管callgrind会让它非常慢。我是否需要为valgrind提供一些命令行参数来增加分配给程序的内存量?第1322行,希望周围的评论能对此有所启发(只是一个建议,我不是valgrind方面的专家),有人找到在哪里更改硬编码限制以重新编译吗?还有,将其更改为什么样的合理值?我仍然不明白什么是brk段,我仍然不知道这是否意味着我的程序、valgrind或我的计算机的功能有问题。@TimKuipers请参见
brk(2)
。这是对内存的低级系统调用。你通常不会用它。查看手册页,它可能至少有助于澄清一些问题。我遇到了相同的错误。上述方法不起作用。它要么是SEGFULTS,要么是报告brk段错误。我确实将它更改为SizeT m8=100*m1,重新编译、重新安装,事实上它确实有助于消除错误消息(使用valgrind 3.13.0测试)。注意,它是M16而不是M8在ValGRIND 3.16.1. .LINININSINTER,不是,16M限制是堆栈的R限界,不是数据RLIME。所以,更具体一些:如果你的应用程序在Linux上运行,并且使用通常的C<代码> MalCube()/<代码>函数和/或C++ <代码>新< /Cord>运算符进行内存分配,可以安全地忽略此valgrind消息,因为malloc库将自动切换到
mmap()
。如果您使用自己的分配器,它只支持
brk()
/
cbrk()
,那么向该分配器添加
mmap()
支持可能仍然比重新编译valgrind容易。