【发布时间】:2020-11-15 16:56:39
【问题描述】:
我使用 jemalloc 3.6.0-11。
我调用 posix_memalign 来分配一个非常大的块。分配后,我调用madvise(ptr, size, MADV_DONTDUMP); 将这个分配从核心转储中排除。
在释放此内存之前,我调用madvise(ptr, size, MADV_DODUMP);,因为我希望如果这些页面将在未来分配中分配,它们将不会保持标记为 DONTDUMP。
问题是在大多数情况下,我刚刚释放的内存并没有返回给OS(即进程的虚拟内存中仍然包含分配;在/proc//status中分配大小仍然是 VmSize 的一部分);事实证明,核心转储是基于进程的虚拟内存的;所以释放内存后,释放的页面将包含在核心转储中。
有人知道如何解决这个问题吗?
提前致谢!
【问题讨论】:
-
我不确定
madvise是否真的与此有关。听起来这只是free()d但未返回给操作系统的内存(例如munmap())将继续包含在核心转储中,就像操作系统分配给进程的所有其他内存一样.毕竟,内核无法知道您当前是否正在使用该内存。 -
我认为您的选择是 (1) 忽略它,(2) 修改或包装
malloc/free在之后/之前执行DODUMP/DONTDUMP,(3) 以某种方式安排malloc返回您的块当你free()它时到操作系统,(4)绕过malloc,用mmap分配你的块,然后在你完成后自己分配munmap。 -
内存实际分配在哪里?如果它在堆上并且不是使用单独的
mmap()调用创建的,那么调用madvise(ptr, size, MADV_DONTDUMP)如果不忽略调用则不是一个好主意,因为它可能会导致堆中的其他内存,你可能会很好 需要您的核心转储分析不会被转储,并且您的调用很可能会被忽略,因为它是用于堆内存。您是在检查madvise()调用的返回值,还是只是假设它们成功了?
标签: c malloc coredump jemalloc