我使用memfd_create、ftruncate、mmap和munmap在linux上实现了一个神奇的环形缓冲区(MRB)。在缓冲区完全构建后,memfd_create返回的memfd_create获取close()d。MRB本身运行良好,工作正常。
问题是:
gcore.
gdb <executable> -c <core-file>。
然后gdb打印一个警告:
warning: Can't open file /memfd:magicringbuffer (deleted) during file-backed mapping note processing补充说明:
"magicringbuffer"是memfd_create(const char *name, unsigned int flags);name参数传递的字符串,并在CentOS version 7上运行。
问题:
close()'d?<executable>确实是一个具有调试符号的二进制。
我试着在网上寻找答案,但没有找到令人满意的答案。
发布于 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区域一样转储到核心文件中,而不是生成文件支持的映射注释。
https://stackoverflow.com/questions/73812207
复制相似问题