C++ 使用Valgrind运行时,malloc返回null

C++ 使用Valgrind运行时,malloc返回null,c++,c,linux,memory-management,valgrind,C++,C,Linux,Memory Management,Valgrind,我有一个巨大的分配(几十GB)发生在一个malloc调用中,它在正常情况下工作。该系统有一个巨大的RAM,是一台运行2.6 x86_64内核的64位机器 mem-rlimit已通过setrlimit实现为无穷大 我想用Valgrind运行它来进行内存分析并检查泄漏 但malloc失败,在使用valgrind运行时返回空指针 我试着减少分配的规模,但没有帮助 有什么意见吗 问候,, -J注意malloc(3)在欺骗你——它实际上并不是一次分配所有内存,它只是向操作系统请求内存,而操作系统则向mal

我有一个巨大的分配(几十GB)发生在一个malloc调用中,它在正常情况下工作。该系统有一个巨大的RAM,是一台运行2.6 x86_64内核的64位机器

mem-rlimit已通过setrlimit实现为无穷大

我想用Valgrind运行它来进行内存分析并检查泄漏

但malloc失败,在使用valgrind运行时返回空指针

我试着减少分配的规模,但没有帮助

有什么意见吗

问候,, -J

注意
malloc(3)
在欺骗你——它实际上并不是一次分配所有内存,它只是向操作系统请求内存,而操作系统则向
malloc(3)
撒谎。这是完全正常的行为,大多数情况下都可以正常工作。
proc(5)
中的
/proc/sys/vm/overmit_memory
说明包含以下详细信息:

/proc/sys/vm/overmit\u内存
此文件包含内核虚拟内存
会计模式。价值观是:
0:启发式过度提交(这是默认值)
1:总是超负荷,从不检查
2:总是检查,永远不要过度承诺
在模式0中,不允许使用MAP_NORESERVE调用mmap(2)
选中,默认检查非常弱,导致
有可能导致进程“OOM死亡”。在下面
Linux 2.4任何非零值都意味着模式1。在模式2中
(从Linux 2.6开始提供),总虚拟地址
系统上的空间限制为(SS+RAM*(r/100)),
其中SS是交换空间的大小,RAM是
物理内存的大小,r是
文件/proc/sys/vm/overmit\u比率。
瓦尔格兰德不可能如此轻率;它实际上跟踪进程的已分配、已初始化和未初始化内存。因此,它需要比进程本身更多的内存,并且它对过度提交内存没有相同的容忍度


我不知道在valgrind下运行该程序需要多少内存,但请尝试再添加几GB的交换空间。通过使用
dd
将零写入文件(不要使用稀疏文件),然后对文件运行
mkswap(8)
对其进行初始化并运行
swapon(8),可以创建一个新的交换文件
使用文件名通知系统将其用作交换文件。

Valgrind使用大量虚拟机来跟踪虚拟机的其余部分。此系统有多少RAM?有多少个数十Gb?vm/Overmit_内存设置为2,这意味着它永远不会过度分配。我可能应该通过将其设置为1来进行测试。超负荷率是110。我不认为这是问题所在。相反,valgrind需要大量内存来跟踪/调试您使用的所有内存。如果我没记错的话,对于某些类型的分配,它甚至会复制它们以供自己的跟踪使用,因此分配10gb实际上可能需要20gb…@R..:取决于运行的检查,但是是的,
memcheck
实际上会复制内存,因为它跟踪位级别的写入。