为什么linux将干净的MAP_ANONYMOUS内存页转储到核心转储?
Why does linux dump clean MAP_ANONYMOUS memory pages to core dump?
我想使用mmap将大的连续内存区域映射到我的进程中。这只是一个大的预分配缓冲区,其中大部分不太可能被使用。我实际上可以创建tb级的这样的内存区域,即使这超过了我的物理内存+硬盘大小。当我访问映射区域中的地址时,Linux将在页面中进行映射。不幸的是,如果在调用mmap之后生成一个核心转储,但在接触新的内存区域之前,那么核心转储将包括那个LARGE内存区域。为什么?Linux将不得不在一个没有填充内存的新页面中分页,以便将其写入核心文件。
我为什么要这样做?如果我的生产者总是可以将数据附加到一个连续的缓冲区中,并且我的消费者可以读取生产者后面的数据,并假设它的读头和生产者的写头之间的所有数据都是可消费的,那么我的代码将更简单和更高效。我计划在我的读头高级通过页面边界后使用madvise,让操作系统知道它不再需要为我保存这些内存页。
核心转储将包含该LARGE内存区域。为什么?
因为在这些条件下,内核没有优化到减少内核文件大小。
很可能内核可以查看给定内存区域中的每个页面,并跳过所有未修改的页面。我不确定这样的补丁是否会被接受。
你可以用google用户级coreddump代替。
相关文章:
- GDB:在转储的整个内存中查找值
- 内存集分段故障内核转储
- crtdbg 在使用 sf::Text::setOutlineThickness 时转储内存泄漏
- 如何使用 windbg "dt"命令从命名空间污染的内存转储中获取信息
- Visual C 结构抛出内存转储
- 内存核心转储C
- 分段错误(核心转储),内存集位于C++的字符指针中
- 转储内存以查找C++应用程序中的内存泄漏
- 内存转储未在C++释放模式下写入
- 从内存转储中查找线程消息队列中的消息
- 将进程内存转储到文件/从转储文件重新创建进程
- 运行时出现内存转储错误
- 分段错误(核心转储)C++,因为我使用了大量内存
- 从转储中确定内存中存在的对象的类型
- 使用Windbg从转储文件中分析可能的内存泄漏
- 为什么linux将干净的MAP_ANONYMOUS内存页转储到核心转储?
- 将2D数组错误定位为参数会导致内存转储
- 带有动态内存核心转储错误的自定义Deck类
- 转储函数的内存
- 虚拟内存和核心转储之间的关系