c++ - gdb 如何读取正在调试的程序/进程的寄存器值?寄存器如何与进程相关联?

标签 c++ debugging assembly operating-system cpu-registers

我用 C++ 写了一个小程序:

#include<iostream>
using namespace std;

    int main(){
    int x=10;
    int y=20;
    cout<< x+y <<endl;
    return 0;
    }

出于好奇,我想了解幕后的程序,所以我在玩 gdb 并偶然发现了 info registers命令。当我使用info registersgdb我得到这样的输出:

(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

我知道这些是寄存器及其值,但我想知道的是如何/为什么 registersprocess 相关联.寄存器的值应该随着操作系统调度不同的进程而不断变化?我引用了命令 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/

相关文章:

c++ - 编写一个可以嵌入其他应用程序并作为单独进程运行的 shell

c++ - 如何在 objective-c 中表达 (5 x 5.4 10-3)

c++ - 标签地址 (MSVC)

c - 堆栈组装

C++ winsockets 线程问题

c++ - 2038 年 32 位翻转 time()

php - PHP解析/语法错误;以及如何解决它们

java - Sigar 不满意链接错误

java - 使用 Intellij 调试远程 java 应用程序

c - 手动组装与 GCC