硬件断点和软件断点有什么区别?
硬件断点据说比软件断点更快吗?如果是,那么怎么做?为什么我们需要软件断点呢?
发布于 2012-01-16 10:39:45
本文很好地讨论了利弊:http://www.nynaeve.net/?p=80
要直接回答您的问题,软件断点更灵活,因为硬件断点在某些功能和高度依赖于体系结构方面受到限制。本文给出的一个例子是,x86硬件有4个硬件断点的限制。
硬件断点速度更快,因为它们具有专用寄存器,并且开销小于软件断点。
发布于 2014-12-15 18:32:56
硬件断点实际上是比较器,将当前PC与比较器中的地址进行比较(如果启用的话)。设置断点时,硬件断点是最好的解决方案。通常通过调试探针设置(使用JTAG、SWD、.)。硬件断点的缺点:它们是有限的。CPU只有有限数量的硬件断点(比较器)。可用硬件断点的数量取决于CPU。ARM 7/9核心有2台,现代ARM设备(皮质-M 0,3, 4 )介于2到6之间,x86通常为4。
实际上,软件断点是通过用断点指令替换要断点的指令来设置的。断点指令存在于大多数CPU中,通常短于最短的指令,因此在x86上只有一个字节(0xcc,INT 3)。在Cortex-M CPU上,指令是2或4字节,所以断点指令是2字节指令。
如果程序位于RAM中(例如在PC上),则可以很容易地设置软件断点。许多嵌入式系统的程序都位于闪存中。这里不太容易交换指令,因为闪存需要重新编程,所以硬件断点主要使用。如果程序位于闪存中,大多数调试探针只支持硬件断点。然而,有些(如SEGGER的J)允许用断点指令重新编程闪存,而麻生太郎允许无限数量的(软件)断点,即使在调试位于flash中的程序时也是如此。
发布于 2012-01-16 10:50:42
您可以通过GDB内部件,它很好地解释了HW和SW断点。
HW断点需要MCU的支持。ARM控制器有特殊的寄存器,当PC (程序计数器) == sp寄存器CPU停止时,您可以在其中写入一些地址空间。通常需要将Jtag写入这些特殊寄存器。
SW断点是在GDB中通过插入陷阱、非法划分或其他会导致异常的指令来实现的,然后当遇到异常时,gdb将接受异常并停止程序。当用户说要继续时,gdb将恢复原来的指令,单步,重新插入陷阱,然后继续。
与SW调试器相比,使用HW调试器有许多优点,特别是当您处理中断和内存总线设备时。不能用软件调试器调试AFAIK中断。
https://stackoverflow.com/questions/8878716
复制相似问题