硬件和软件断点之间有什么区别?

Aqu*_*irl 30 debugging gdb breakpoints

硬件和软件断点之间有什么区别?

硬件断点是否比软件断点更快,如果是,那么如何,以及为什么我们需要软件断点呢?

Spl*_*iFF 24

本文对优缺点进行了很好的讨论:http://www.nynaeve.net/?p = 80

要直接回答您的问题,软件断点更加灵活,因为硬件断点在某些功能上受到限制,并且高度依赖于架构.本文中给出的一个示例是x86硬件具有4个硬件断点的限制.

硬件断点更快,因为它们具有专用寄存器,并且开销比软件断点少.

  • @TheIndependentAquarius 从技术上讲,您不能有 _unlimited_ 软件断点;) (2认同)

Kam*_*ath 15

您可以通过GDB内部,它很好地解释了硬件和软件断点.

硬件断点是需要MCU支持的东西.ARM控制器有专门的寄存器,只要PC(程序计数器)= = sp寄存器CPU停止,就可以编写一些地址空间.通常要求Jtag写入这些特殊寄存器.

在GDB中实现的SW断点是通过插入陷阱,或非法除法,或其他一些会导致异常的指令,然后当遇到它时,gdb将接受异常并停止程序.当用户说要继续时,gdb将恢复原始指令,单步,重新插入陷阱,然后继续.

使用HW调试器而不是SW调试器有很多优点,特别是在处理中断和内存总线设备时.无法使用软件调试程序调试AFAIK中断.


小智 12

硬件断点实际上是比较器,将当前PC与比较器中的地址进行比较(启用时).设置断点时,硬件断点是最佳解决方案.通常通过调试探针设置(使用JTAG,SWD,...).硬件断点的缺点:它们是有限的.CPU只有有限数量的硬件断点(比较器).可用硬件断点的数量取决于CPU.ARM 7/9内核有2个现代ARM设备(Cortex-M 0,3,4),介于2和6之间,x86通常为4.

软件断点实际上是通过用断点指令替换要断点的指令来设置的.断点指令存在于大多数CPU中,通常与最短指令一样短,因此x86上只有一个字节(0xcc,INT 3).在Cortex-M CPU上,指令是2或4个字节,因此断点指令是2字节指令.

如果程序位于RAM中(例如在PC上),则可以轻松设置软件断点.许多嵌入式系统都将程序放在闪存中.这里交换指令并不容易,因为闪存需要重新编程,因此主要使用硬件断点.如果程序位于闪存中,则大多数调试探针仅支持硬件断点.但是,有些(例如SEGGER的J-Link)允许使用断点指令重新编程闪存,并且即使在调试位于闪存中的程序时也允许无限数量的(软件)断点.

有关闪存中软件断点的更多信息


a10*_*10y 5

除上述答案外,还必须注意,尽管软件断点会覆盖程序中的特定指令以知道在哪里停止,但实际上数量有限的硬件断点实际上是处理器的一部分。

贾斯汀·塞茨(Justin Seitz)在他的《灰色帽子Python》一书中指出,此处的重要区别在于,通过覆盖指令,软件断点实际上会更改文件的CRC,因此,诸如恶意软件之类的任何程序都可以更改其CRC。行为是对设置断点的响应,而对于硬件断点,调试器正在停止并逐步执行某些代码块则不太明显。