我正在Linux下调试GDB中的进程,我发现无法读取/proc/${PID}/maps
中定义的内存区域的内容:
3aaef123000-3aaef125000 r--p 00000000 00:00 0 [vvar]
显然,r
中的r--p
标志表明它是可读的,但GDB总是告诉我它无法访问该内存区域的内容,例如:
警告:无法访问< address> 的< count> 字节目标内存,暂停搜索。
[vvar]
内存区究竟是什么?为什么我不能从GDB中读取它的内容?
编辑:可能有助于回答问题的场外资源:
[vvar]
部分。不明白其中的一半。如果有人能用更简单的术语向我解释,我会很感激。
答案 0 :(得分:3)
[vvar]内存区究竟是什么?
解释here。
为什么我不能从GDB中读取它的内容?
这听起来像是内核ptrace
实现中的一个错误:如果进程可以读取数据,那么进程的跟踪器(GDB)也是如此。
但它并不总是这样。例如,GDB 可以检查进程本身无法访问的堆栈保护页面(即这是相反方向的内核错误)。
<强>更新强>
如果有人能用更简单的术语向我解释,我会很感激
实际上并不多:为了更快地实现某些简单系统调用(例如gettimeofday
),内核可以方便地使某些内核数据可见用户级进程,完全它的作用:将一页(或两个)内核数据“神奇地”映射到某个地址的每个进程,并为用户进程提供一种方法找到该页面出现的虚拟地址。
其余的主要是不相关的实施细节。
您可能还会发现VDSO页面的this explanation有用(它是关于代码而不是数据,但这个想法几乎相同)。