系统相关
首页 > 系统相关> > linux-无法访问GDB中[vvar]内存区域的内容?

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

作者:互联网

我正在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中读取其内容?

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

> Implementing virtual system calls-较旧(2014年10月),最有可能是过时的LWN文章中提到了[vvar]部分.不明白一半.
> vvar, gup && coredump-内核邮件列表线程(2015年3月),该问题似乎是相同的问题.都不明白.

如果有人可以用更简单的方式向我解释这一点,我将不胜感激.

解决方法:

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),内核使一些内核数据对用户级进程可见是很方便的,而这正是它的作用:内核数据的页面(或两个)“神奇地”映射到每个进程的某个地址,并且为用户进程提供了一种方法来查找该页面出现的虚拟地址.

其余大部分与实现细节无关.

您可能还会发现VDSO页面的this explanation很有帮助(这与代码有关,而不是数据有关,但是思想基本相同).

标签:memory,gdb,procfs,linux
来源: https://codeday.me/bug/20191111/2021120.html