Valgrind运行时,malloc返回null。

5
我有一个malloc调用的巨大分配(数十GB),在正常情况下可以工作。系统具有巨大的RAM,并且是运行2.6 x86_64内核的64位机器。
使用setrlimit将mem rlimit设置为无限制。
我想使用Valgrind运行它来进行内存分析并检查泄漏。
但是,当使用valgrind运行时,malloc会失败并返回空指针。
我尝试减少分配的大小,但这并没有帮助。
有任何建议吗?
祝好, -J

Valgrind使用大量虚拟内存来跟踪其余的虚拟内存。 - bmargulies
这个系统有多少RAM?有多少十GB? - Linuxios
1个回答

10

请注意,malloc(3)对你撒谎了 -- 它实际上并没有一次性分配所有内存,它只是向操作系统请求内存,而操作系统向malloc(3)撒谎。这是正常行为,大多数情况下都可以正常工作。在proc(5)中对/proc/sys/vm / overcommit_memory的描述包含详细信息:

   /proc/sys/vm/overcommit_memory
          This file contains the kernel virtual memory
          accounting mode.  Values are:

                 0: heuristic overcommit (this is the default)
                 1: always overcommit, never check
                 2: always check, never overcommit

          In mode 0, calls of mmap(2) with MAP_NORESERVE are not
          checked, and the default check is very weak, leading
          to the risk of getting a process "OOM-killed".  Under
          Linux 2.4 any nonzero value implies mode 1.  In mode 2
          (available since Linux 2.6), the total virtual address
          space on the system is limited to (SS + RAM*(r/100)),
          where SS is the size of the swap space, and RAM is the
          size of the physical memory, and r is the contents of
          the file /proc/sys/vm/overcommit_ratio.

Valgrind不能那么轻率; 它实际上跟踪进程分配的、初始化的和未初始化的内存。因此,它需要比进程本身更多的内存,并且它没有对超量提交内存的相同容忍度。

我不知道你需要多少更多的内存才能在valgrind下运行程序,但是尝试增加几个更多吉字节的交换空间。您可以使用dd将零写入文件来创建一个新的交换文件--不要使用稀疏文件--然后在该文件上运行mkswap(8)进行初始化,并使用文件名运行swapon(8)告诉系统将其用作交换文件。


vm/overcommit_memory被设置为2,这意味着它永远不会过度承诺。我应该通过将其设置为1进行测试。overcommit_ratio为110。 - Jay D
我不认为这是问题所在。相反,valgrind需要大量的内存来跟踪/调试您使用的所有内存。如果我没记错的话,对于某些类型的分配,它甚至会复制它们以供自己进行跟踪使用,因此分配10gb实际上可能需要20gb... - R.. GitHub STOP HELPING ICE
根据运行的检查情况而定,但是是的,memcheck实际上会在级别跟踪写入,因此会复制内存。 - Matthieu M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接