当我学习汇编时,我按以下方式使用 GDB:
gdb ./a.out (a is a compiled C script that only prints hello world)
break main
run
info registers
当我自己使用同一个CPU打印寄存器时,为什么我可以看到我的程序使用的寄存器?难道使用GDB(或操作系统)不应该覆盖寄存器并且只显示被覆盖的寄存器吗?
我能想到的唯一答案是我的CPU是双核的,其中一个核心正在使用,另一个核心用于程序。
操作系统维护每个执行线程的寄存器的状态。当您检查 gdb 中的寄存器时,调试器实际上是要求操作系统从保存的状态读取寄存器值。您的程序在该时间点并未运行,而是调试器在运行。
假设您的系统上没有其他进程。以下是所发生情况的简化视图:
- 调试器启动并获取CPU
- 调试器要求操作系统加载您的程序
- 调试器要求操作系统放置断点
- 调试器要求操作系统开始执行您的程序。操作系统保存 gdb 寄存器状态并将控制权转移给您的程序。
- 您的程序到达断点。操作系统接管控制权,保存程序的寄存器状态,重新加载 gdb 寄存器并将 cpu 交还给 gdb。
- 调试器要求操作系统从保存的状态读取程序的寄存器。
请注意,此机制是多任务操作系统正常职责的一部分,并非特定于调试。当操作系统调度程序决定应该执行不同的程序时,它会保存当前状态并加载另一个程序。这称为上下文切换,每秒可能发生多次,即使只有一个 CPU 核心,也会给人一种程序同时执行的错觉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)