【发布时间】:2017-09-19 01:43:08
【问题描述】:
我编译了一个简单的代码并通过 GDB 运行它。
当我在 GDB 中运行我的简单程序时,GDB 向我显示程序的虚拟地址(在我的程序的可执行目标文件中定义)。
GDB 也是一个程序。所以 GDB 有自己的虚拟地址。因为 GDB 有自己的虚拟地址,所以当 GDB 映射我的简单程序获取虚拟地址时,我的简单程序在 GDB 的虚拟地址空间中会有不同的虚拟地址。
但是 GDB 并没有向我显示那个地址。相反,GDB 向我显示了我的简单程序的虚拟地址,它在我的简单程序的可执行目标文件中定义。
这是怎么发生的? GDB 有虚拟到虚拟地址表吗?
【问题讨论】:
-
您可能会发现由三部分组成的系列How debuggers work 很有帮助。
-
哦,谢谢。那份文件对我有帮助。
-
不,您的程序在附加到 gdb 自己的地址空间时不会获得不同的虚拟地址空间。您的程序无法知道它正在被调试,因为 gdb 使用可用的标准 linux 工具启动您的程序。它继续拥有与 gdb 意识到它之前相同的虚拟地址。 GDB 是将附加的进程地址(在其自己的虚拟地址空间中)转换为附加进程的虚拟地址空间的程序,因此您拥有正确的地址,就像没有涉及 gdb 一样。