无法访问GDB中[vvar]内存区域的内容?

时间:2017-03-11 01:21:53

标签: linux memory gdb procfs

我正在Linux下调试GDB中的进程,我发现无法读取/proc/${PID}/maps中定义的内存区域的内容:

3aaef123000-3aaef125000 r--p 00000000 00:00 0                            [vvar]

显然,r中的r--p标志表明它是可读的,但GDB总是告诉我它无法访问该内存区域的内容,例如:

  

警告:无法访问< address> < count> 字节目标内存,暂停搜索。

[vvar]内存区究竟是什么?为什么我不能从GDB中读取它的内容?

编辑:可能有助于回答问题的场外资源:

  • Implementing virtual system calls - 一篇旧文章(2014年10月),很可能是过时的LWN文章,提到了[vvar]部分。不明白其中的一半。
  • vvar, gup && coredump - 内核邮件列表主题(2015年3月),关于什么似乎是同一个问题。不明白。

如果有人能用更简单的术语向我解释,我会很感激。

1 个答案:

答案 0 :(得分:3)

  

[vvar]内存区究竟是什么?

解释here

  

为什么我不能从GDB中读取它的内容?

这听起来像是内核ptrace实现中的一个错误:如果进程可以读取数据,那么进程的跟踪器(GDB)也是如此。

但它并不总是这样。例如,GDB 可以检查进程本身无法访问的堆栈保护页面(即这是相反方向的内核错误)。

<强>更新

  

如果有人能用更简单的术语向我解释,我会很感激

实际上并不多:为了更快地实现某些简单系统调用(例如gettimeofday),内核可以方便地使某些内核数据可见用户级进程,完全它的作用:将一页(或两个)内核数据“神奇地”映射到某个地址的每个进程,并为用户进程提供一种方法找到该页面出现的虚拟地址。

其余的主要是不相关的实施细节。

您可能还会发现VDSO页面的this explanation有用(它是关于代码而不是数据,但这个想法几乎相同)。