【发布时间】:2018-07-24 22:36:14
【问题描述】:
我用c++写了一个小程序:
#include<iostream>
using namespace std;
int main(){
int x=10;
int y=20;
cout<< x+y <<endl;
return 0;
}
出于好奇,我想了解幕后的程序,所以我在玩 gdb 并遇到了info registers 命令。当我在gdb 中使用info registers 时,我得到如下输出:
(gdb) info registers
rax 0x400756 4196182
rbx 0x0 0
rcx 0x6 6
rdx 0x7fffffffd418 140737488344088
rsi 0x7fffffffd408 140737488344072
rdi 0x1 1
rbp 0x7fffffffd320 0x7fffffffd320
rsp 0x7fffffffd320 0x7fffffffd320
r8 0x7ffff7ac1e80 140737348640384
r9 0x7ffff7dcfea0 140737351843488
r10 0x7fffffffd080 140737488343168
r11 0x7ffff773a410 140737344939024
r12 0x400660 4195936
r13 0x7fffffffd400 140737488344064
r14 0x0 0
r15 0x0 0
rip 0x40075a 0x40075a <main+4>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
我知道这些是寄存器及其值,但我想知道registers 如何/为什么与process 相关联。随着操作系统调度不同的进程,寄存器的值应该不断变化吗?我提到了命令info registers & 这是我发现的,但这仍然令人困惑。
info registers -> 打印所有寄存器的名称和值,除了 浮点和向量寄存器(在选定的堆栈帧中)。
【问题讨论】:
-
这不是关于汇编和调试器的问题,而是更多关于操作系统和多任务如何工作的问题。简而言之,操作系统保留所有寄存器的副本。每个执行线程一个副本。
-
@anekix Google 搜索上下文切换.
-
@anekix 您需要阅读上下文切换的详细信息,而不仅仅是名称。保存寄存器值是上下文切换最基本的步骤之一。
-
@anekix 正确。
-
调试器显示特定调试线程的寄存器状态,而不是调试器实现或其他任务的 CPU 寄存器的实际值,因此如果您已对调试代码设置断点,则寄存器状态不应更改全部(但它显示的是该断点线程的已保存寄存器状态,而不是物理 CPU 寄存器,调试器本身使用它们只是为了产生该输出,因此它们包含完全不相关的值)。
标签: c++ debugging assembly operating-system cpu-registers