如何通过gdb-stub / server处理SW断点

时间:2015-04-12 06:21:03

标签: gdb gdbserver

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

我的实际问题:

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

如何单步执行断点工作,以便原始的非断点指令被执行,断点在单步执行后仍然保留在那里?

[编辑] 忘了:文件" GDB Internals"似乎缺少那些信息 - 实际上是关于单一步进的整个子章节"算法"章。

[EDIT2] 啊,我似乎需要更强大的眼镜:' Internals' -manual说: "当用户说要继续时,GDB将恢复原始指令,单步,重新插入陷阱,然后继续。"

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

1 个答案:

答案 0 :(得分:1)

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

它的完成方式与continue完全相同,除了最后一步(“并继续”)。那就是:

  1. 流程停止。 GDB“环顾四周”,发现$ip指向其中一个断点。
  2. 用户问题continuenextstepstepi命令。
  3. 恢复原始指令(即删除断点)
  4. 单步流程
  5. 重新插入断点
  6. 继续(适用于continue但不适用于nextstepstepi
  7. 对于stepi,将控制权交还给用户(由于上面的步骤4,我们已经在下一条指令处)。对于next,继续单步执行,直到我们到达源代码中的行,该行与上面步骤1中的行不同。