2015-04-12 128 views
0

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

我实际的问题:

当一个断点时,是如何保存的指令运行,这样,断点可以“重新安装”和(保存)机器状态(包括寄存器的内容)不会改变从击中断点的那一刻开始? =>何时重新安装断点以及如何?在断点击中和进入命令解释器之间,还是在下一步或coninue?

又如何单步跳过断点工作,使原始的非断点指令得到执行,并且断点在单步后仍然保持在那里?

忘记:文档“GDB内部”似乎缺少该信息 - 实际上整个子章节中关于单步执行“算法”一章。

[EDIT2] 啊,我似乎需要更强有力的眼镜:在“Internals'-手册说: “当用户说继续,GDB会恢复原来的指令,单步,重新插入陷阱,并继续。“

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

回答

1

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

它和continue完全一样,除了最后一步(“和继续”)。即:

  1. 进程停止。 GDB“环顾四周”,发现$ip指向其中一个断点。
  2. 用户问题continuenext,stepstepi命令。
  3. 恢复原始指令(即删除断点)
  4. 单步过程
  5. 重新插入断点
  6. 继续(这是为完成continue但不能用于nextstepstepi)。
  7. 对于stepi,将控制返回给用户(由于上述步骤4我们已经在下一条指令)。对于next,请继续单步操作,直到我们到达与上述第1步中所在行不同的行中的某一行。
+0

如果确实如此,则单步替换/恢复指令将会陷入陷阱(早先通过设置断点)。这将导致单步内的断点。 – turboscrew

+0

@turboscrew你错了,它*做*这样做。 Souce:我是GDB开发人员。单步处理(步骤4)意味着在'EFLAGS'中设置'TF'标志并继续。处理器将自动执行一个(原始的,在步骤3中恢复的)指令,然后停止。 –

+0

“SW断点如何处理” - 没有陷阱标志(顺便说一下,我没有使用x86或x86_64系列)。 AAARGH,我明白了:你的意思是通过'恢复原始指令'去除断点。 – turboscrew