memfd_create实现MRB生成core文件后GDB警告问题咨询
关于memfd_create构建的环形缓冲区在gdb调试core文件时的警告问题
问题背景
我在CentOS 7系统上,用memfd_create、ftruncate、mmap和munmap实现了魔法环形缓冲区(MRB)。缓冲区构造完成后,我关闭了memfd_create返回的文件描述符,MRB运行完全正常。但用gcore生成进程的core文件,再通过gdb <executable> -c <core-file>调试时,出现了如下警告:
warning: Can't open file /memfd:magicringbuffer (deleted) during file-backed mapping note processing
其中magicringbuffer是调用memfd_create时传入的name参数值。我有两个问题需要解答:
- 这个警告的确切含义是什么?成因是该文件属于虚拟文件,还是因为我调用了
close()? - 这个警告会带来哪些影响?会不会导致调试符号丢失?(我的可执行文件带有完整调试符号)
问题解答
1. 警告含义与成因
- 警告的准确含义:GDB在解析core文件中的内存映射记录时,找不到该映射对应的底层文件
/memfd:magicringbuffer(该文件已被标记为"deleted"),无法打开它来验证或读取映射的文件内容。 - 成因是调用了
close():memfd_create创建的是匿名文件系统中的临时文件,当你关闭它的文件描述符后,这个文件就没有了活跃的引用,内核会将其标记为已删除。不过进程通过mmap建立的内存映射依然能正常工作,因为映射的是文件的页缓存。GDB调试core文件时,会尝试为每个内存映射找到对应的源文件,但这个memfd文件已经被销毁,所以触发了该警告。
2. 警告的影响
- 不会导致调试符号丢失:调试符号存储在可执行文件本身,和memfd的映射文件没有关联。只要你的可执行文件带有完整调试符号,GDB依然能正常解析函数名、变量名等所有调试信息。
- 实际影响非常有限:GDB无法读取该memfd对应的文件内容,所以当你尝试查看环形缓冲区的内存区域时,GDB没法从源文件验证或补充数据,但core文件已经保存了进程生成core时该内存区域的所有数据,你依然可以用
x命令等直接查看缓冲区的内存内容,这个警告对其他调试操作没有任何影响。
内容的提问来源于stack exchange,提问作者archy7
相关产品推荐
相关产品推荐

