草庐IT

memory-leak-detector

全部标签

linux - mmap() : resetting old memory to a zero'd non-resident state

我正在编写内存分配例程,目前运行顺利。我使用4096字节页面中的mmap()从操作系统获取内存。当我启动我的内存分配器时,我使用mmap()分配了1gig的虚拟地址空间,然后随着分配的进行,我根据我的分配算法的细节将它分成block。我觉得一时兴起分配多达1gig的内存是安全的,因为我知道mmap()实际上不会将页面放入物理内存,直到我实际写入它们。现在,使用我的分配器的程序可能会突然需要大量内存,在这种情况下,操作系统最终必须将整个1gig的页面放入物理RAM中。问题是程序可能会进入休眠期,释放大部分1gig,然后只使用最少的内存。然而,我在分配器的MyFree()函数中真正做的就是

c++ - LeakSanitizer : get run time leak reports?

我继承了一些遗留代码,似乎某处有内存泄漏。我的第一直觉是用编译-faddress=sanitize-fno-omit-frame-pointer让AddressSanitizer的工具系列帮我找到漏洞。然而,我非常失望。我希望出现某种运行时错误消息(类似于地址清理程序在您不应该读取或写入内存时的错误)。在程序成功完成之前,泄漏sanitizer似乎不会进行任何泄漏检查分析。我的问题是我继承的代码有多个线程,它并不是为了将所有线程都加入到软着陆准备中而设计的。我用一个简单的例子简化了我的问题:#include#include#includeboolexit_thread=false;vo

c - 为什么在 POSIX 中创建消息队列时出现错误 "Cannot Allocate Memory"?

为什么在POSIX中创建消息队列时出现“无法分配内存”错误? 最佳答案 Adrian的回答是正确的,但由于这是一个令人沮丧的常见错误,当第一次尝试将POSIX消息队列用于任何非平凡的事情时,在Linux上会遇到这个错误,我想我应该添加一些有用的细节。首先,要了解RLIMIT_MSGQUEUE资源限制,请参阅mansetrlimit中的公式:RLIMIT_MSGQUEUE(SinceLinux2.6.8)SpecifiesthelimitonthenumberofbytesthatcanbeallocatedforPOSIXmessa

c/linux无限循环应用: deallocate memory if kill -9 command is called

我在Linux中开发了一个C应用程序,其中包含一个无限循环while(1)。有一些指针是动态分配的,在无限循环下很有用,所以释放内存的唯一时间是在ctrl-z中断while(1)之后,ctrl-c,kill-9apppid,killallappname。所以我的想法是关联新的处理程序,将内存释放给中断事件信号。voiddeallocatehandler(intsignal){printf("MemoryDeallocation\n");exit(0);}intmain(){signal(SIGINT,&deallocatehandler);signal(SIGTSTP,&dealloc

c - Linux 中的 malloc() - "there is no guarantee that the memory really is available"?

我正在制作一款游戏,其中世界被分成描述世界的数据block。我将block保存在一个动态分配的数组中,因此在初始化世界数据结构时我必须使用malloc()。阅读malloc()manpage,有注释如下:Bydefault,Linuxfollowsanoptimisticmemoryallocationstrategy.Thismeansthatwhenmalloc()returnsnon-NULLthereisnoguaranteethatthememoryreallyisavailable.Incaseitturnsoutthatthesystemisoutofmemory,one

c++ - C、C++ : Shared libraries: Are single functions or complete libraries loaded into memory?

在静态编译中,只有程序实际需要的库函数才会链接到程序。共享库怎么样?动态链接器是只将程序实际需要的函数加载到内存中,还是始终加载整个共享库?如果它是函数,我如何获得程序的实际大小,包括它在运行时加载的函数?谢谢!奥利弗 最佳答案 通过静态编译,只有程序实际需要的库函数才会链接到程序。共享库怎么样?共享库由程序以符号方式引用,也就是说,程序将通过名称识别它所链接的共享库。动态链接器是仅将程序实际需要的函数加载到内存中,还是始终加载整个共享库?程序将引用共享库中的特定入口点和数据对象。共享库将作为单个大对象映射到内存中,但内核只会调入实

c - Linux :Identifying pages in memory

我想知道一个大文件的哪一部分缓存在内存中。我正在使用来自fincore的一些代码为此,它是这样工作的:文件被映射,然后fincore在地址空间上循环并使用mincore检查页面,但是由于文件大小(几个TB),它很长(几分钟)。有没有办法在使用过的RAM页面上循环?它会快得多,但这意味着我应该从某个地方获取已用页面的列表......但是我找不到允许这样做的方便的系统调用。代码如下:#include#include#include#include#include#include#include#include/*}*/#include#include#include#include#inc

C/Linux : dual-map memory with different permissions

我的程序将数据指针传递给第三方插件,目的是数据应该是只读的,所以最好防止插件写入数据对象。理想情况下,如果插件尝试写入,则会出现段错误。我听说有一些方法可以双重映射一个内存区域,这样第二个虚拟地址范围就指向相同的物理内存页面。第二个映射没有写权限,导出的指针将使用此地址范围而不是原始(可写)地址范围。我宁愿不改变原来的内存分配,无论他们碰巧使用malloc或mmap或其他什么。谁能解释一下如何做到这一点? 最佳答案 获得双重映射是可能的,但需要一些工作。我知道如何创建这种双重映射的唯一方法是使用mmap函数调用。对于mmap,您需要

linux - GNU malloc_info() : get really allocated memory?

我正在尝试调查大型多线程服务器的内存使用情况。根据mallinfo(),我得到arena=350M和fordblks=290M,这表明大部分空间实际上在malloc()内部被浪费了.malloc_info()函数提供了一个很好的XML数据结构,应该是不言自明的。不过,有人能给我解释一下吗是堆0特别的?是所有其他人所在的主要舞台吗?是block已分配、空闲/可用或两者兼而有之?什么是元素?使用mmap()/sbrk()分配的内存?什么是元素?可用内存?那呢??作为开始,我希望能够根据malloc()绘制应用程序分配的总内存,即所有已分配但尚未释放的内存。认为。

Python 多处理 - 调试 OSError : [Errno 12] Cannot allocate memory

我面临以下问题。我正在尝试并行化更新文件的函数,但由于OSError:[Errno12]无法分配内存,我无法启动Pool()。我已经开始在服务器上环顾四周,这不像是我在使用一个旧的、弱的/实际内存不足的服务器。参见htop:此外,free-m显示除了~7GB的交换内存外,我还有足够的可用RAM:我尝试处理的文件也不是那么大。我将在下面粘贴我的代码(和堆栈跟踪),大小如下:使用的predictionmatrix数据帧占用了大约。80MB根据pandasdataframe.memory_usage()文件geo.geojson是2MB我该如何调试它?我可以检查什么以及如何检查?感谢您提供任