gdb存根或服务器如何(概念上)处理SW断点(我假设客户端存根和服务器以几乎相同的方式处理它们)?我对gdb存根/服务器运行的"裸机"目标感兴趣,断点和单步执行都使用软件中断。
我的实际问题:
当遇到断点时,如何运行存储的指令,以便断点可以"重新安装",并且从遇到断点的那一刻起(保存的)机器状态(包括寄存器内容)不会发生变化?=>断点何时重新安装以及如何重新安装?在断点命中和进入命令解释器之间,还是在下一个步骤或过程中?
此外,单步跳过断点是如何工作的,从而执行原始的非断点指令,并且断点在单步跳过后仍然保留在那里?
[编辑]忘记了:文件"GDB内部"似乎缺少这一信息,实际上也缺少"算法"一章中关于单步执行的整个分章。
[编辑2]啊,我似乎需要更结实的眼镜:"内部"手册上写着:"当用户说要继续时,GDB将恢复原始指令,单步执行,重新插入陷阱,然后继续。">
然而,单次跨过断点仍然是一个悬而未决的问题。
然而,单步越过断点仍然是一个悬而未决的问题。
除了最后一步("and continue on")之外,它的执行方式与continue
完全相同。即:
- 进程停止。GDB"环顾四周",发现
$ip
指向它的一个断点 - 用户发出
continue
、next
、step
或stepi
命令 - 恢复原始指令(即删除断点)
- 单步处理
- 重新插入断点
- 继续(对
continue
执行此操作,但对next
、step
或stepi
不执行此操作) - 对于
stepi
,将控制权返回给用户(由于上面的步骤4,我们已经在执行下一条指令)。对于next
,继续单步执行,直到我们到达源中的一行,该行与我们在上面步骤1中使用的行不同