首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gdb核心转储警告:无法在文件支持映射注释处理期间打开文件/memfd:magicringbuffer (已删除)。

gdb核心转储警告:无法在文件支持映射注释处理期间打开文件/memfd:magicringbuffer (已删除)。
EN

Stack Overflow用户
提问于 2022-09-22 09:22:14
回答 1查看 361关注 0票数 0

我使用memfd_createftruncatemmapmunmap在linux上实现了一个神奇的环形缓冲区(MRB)。在缓冲区完全构建后,memfd_create返回的memfd_create获取close()d。MRB本身运行良好,工作正常。

问题是:

gcore.

  • They尝试在运行此MRB的进程上创建核心文件,然后尝试使用gdb <executable> -c <core-file>

然后gdb打印一个警告:

代码语言:javascript
复制
warning: Can't open file /memfd:magicringbuffer (deleted) during file-backed mapping note processing

补充说明:

  • "magicringbuffer"memfd_create(const char *name, unsigned int flags);
  • built中作为name参数传递的字符串,并在CentOS version 7

上运行。

问题:

  • 这个警告到底是什么意思?是什么原因?是因为“文件”是虚拟的吗?或者因为它是close()'d?
  • What的含义?它会导致缺少调试符号吗?<executable>确实是一个具有调试符号

的二进制

我试着在网上寻找答案,但没有找到令人满意的答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-22 12:29:29

GDB试图在核心转储时尽可能准确地重构前一个进程的虚拟地址空间。这包括重新创建所有mmap区域。这条消息仅仅意味着GDB试图重新创建由memfd支持的mmap区域,但失败了。IIRC,核心文件中的注释,它告诉GDB存在mmap区域--“文件支持的映射注释”--是在memfd_create之前设计的,所以GDB不知道它应该调用memfd_create()而不是常规的旧open()。即使是这样,它也无法恢复对原始memfd区域的访问(当您从核心转储进行调试时,这个访问可能会完全消失)。

这样做的实际结果是,当从核心转储进行调试时,您将无法查看魔术环缓冲区中的内存内容。但是,调试符号应该不受影响。

这可以说是内核或gcore中的一个bug (不确定是哪一个);memfd支持的内存区域的内容可以被像MAP_ANONYMOUS区域一样转储到核心文件中,而不是生成文件支持的映射注释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73812207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档