gdb存根/服务器如何处理SW断点



gdb存根或服务器如何(概念上)处理SW断点(我假设客户端存根和服务器以几乎相同的方式处理它们)?我对gdb存根/服务器运行的"裸机"目标感兴趣,断点和单步执行都使用软件中断。

我的实际问题:

当遇到断点时,如何运行存储的指令,以便断点可以"重新安装",并且从遇到断点的那一刻起(保存的)机器状态(包括寄存器内容)不会发生变化?=>断点何时重新安装以及如何重新安装?在断点命中和进入命令解释器之间,还是在下一个步骤或过程中?

此外,单步跳过断点是如何工作的,从而执行原始的非断点指令,并且断点在单步跳过后仍然保留在那里?

[编辑]忘记了:文件"GDB内部"似乎缺少这一信息,实际上也缺少"算法"一章中关于单步执行的整个分章。

[编辑2]啊,我似乎需要更结实的眼镜:"内部"手册上写着:"当用户说要继续时,GDB将恢复原始指令,单步执行,重新插入陷阱,然后继续。">

然而,单次跨过断点仍然是一个悬而未决的问题。

然而,单步越过断点仍然是一个悬而未决的问题。

除了最后一步("and continue on")之外,它的执行方式与continue完全相同。即:

  1. 进程停止。GDB"环顾四周",发现$ip指向它的一个断点
  2. 用户发出continuenextstepstepi命令
  3. 恢复原始指令(即删除断点)
  4. 单步处理
  5. 重新插入断点
  6. 继续(对continue执行此操作,但对nextstepstepi不执行此操作)
  7. 对于stepi,将控制权返回给用户(由于上面的步骤4,我们已经在执行下一条指令)。对于next,继续单步执行,直到我们到达源中的一行,该行与我们在上面步骤1中使用的行不同

最新更新