我用 C++ 写了一个小程序:
#include<iostream>
using namespace std;
int main(){
int x=10;
int y=20;
cout<< x+y <<endl;
return 0;
}
出于好奇,我想了解幕后的程序,所以我在玩 gdb 并偶然发现了 info registers
命令。当我使用info registers
在 gdb
我得到这样的输出:
(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 -> Prints the names and values of all registers except floating-point and vector registers (in the selected stack frame).
最佳答案
寄存器一直在变化。事实上,即使是调试器也会更改寄存器值,因为它必须自行运行。
但是,当您使用调试器查看您的程序时,调试器会暂停您正在运行的进程。作为挂起的一部分,CPU 状态被保存到 RAM 中。调试器理解这一点,并且可以只查看 RAM 中的挂起状态。假设寄存器 R1 在挂起时保存到地址 0x1234
,那么调试器可以只打印存储在该地址的字节。
关于c++ - gdb 如何读取正在调试的程序/进程的寄存器值?寄存器如何与进程相关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48785758/