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

Unable to access contents of a [vvar] memory region in GDB?

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

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

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

warning: Unable to access <count> bytes of target memory at <address>, halting search.

[vvar] 内存区域到底是什么?为什么我不能从 GDB 读取它的内容?

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

如果有人能用更简单的术语向我解释一下,我将不胜感激。

What exactly is a [vvar] memory region?

说明here.

Why can't I read its contents from GDB?

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

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

更新:

I'd appreciate it if anyone could explain this to me in simpler terms

其实没什么大不了的:为了更快的实现某些简单的系统调用(比如gettimeofday),方便内核做一些内核数据对用户级进程可见,这就是确切它的作用:内核数据的一页(或两页)被"magically"映射到某个地址的每个进程, 并为用户进程提供了一种方法来查找该页面出现的虚拟地址。

其余大部分是不相关的实现细节。

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