断点如何在C++代码中工作?

gab*_*lin 38 c++ debugging breakpoints

断点如何在C++代码中工作?在编译代码时,它们是否在某些汇编指令之间插入了特殊指令?或者还有其他的东西吗?此外,如何实现代码逐步执行?和断点一样......?

Xeo*_*eor 38

这很大程度上取决于CPU和调试器.

例如,x86 CPU上可能的解决方案之一:

  • 在所需位置插入一字节INT3指令
  • 等到断点异常命中
  • 将异常地址与断点列表进行比较以确定哪个断点
  • 做断点行动
  • 将INT3替换为原始字节,并将调试过程切换到跟踪模式(逐步执行CPU指令)
  • 继续调试过程
  • 您立即捕获跟踪异常 - 指令已执行
  • 把INT3放回去

观察点可以以类似的方式实现,但是您可以将内存页面置于只读状态,或者进入无访问模式,而不是INT3,并等待分段异常.

也可以使用跟踪模式来逐步执行组装.也可以通过基于调试数据将断点放在下一条指令上来逐步执行源代码行.

当你只是将地址加载到某个寄存器时,一些CPU也有硬件断点支持.


Chr*_*isF 8

根据technochakra.com 上的这篇博客文章,你是对的:

软件断点通过在正在调试的程序中插入特殊指令来工作.英特尔平台上的这条特殊指令是"int 3".执行时,它调用调试器的异常处理程序.

我不确定如何实现下一条指令的执行.但是,文章继续补充:

出于实际原因,每当添加或删除断点时都要求重新编译是不明智的.调试器更改内存中可执行文件的加载图像,并在运行时插入"int 3"指令.

但是,这只会用于"运行到当前行选项".