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

时间:2012-01-16 10:30:42

标签: debugging gdb breakpoints

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

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

7 个答案:

答案 0 :(得分:22)

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

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

硬件断点更快,因为它们具有专用寄存器,并且开销低于软件断点。

答案 1 :(得分:14)

你可以通过GDB internals,它很好地解释了硬件和软件断点。

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

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

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

答案 2 :(得分: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)允许使用断点指令重新编程闪存,并且即使在调试位于闪存中的程序时也允许无限数量的(软件)断点。

More info about software breakpoints in flash memory

答案 3 :(得分:4)

除了上面的答案之外,还需要注意的是,虽然软件断点会覆盖程序中的特定指令以了解停止的位置,但硬件断点数量的限制实际上是处理器的一部分。

Justin Seitz在他的书Gray Hat Python中指出,这里的重要区别在于,通过覆盖指令,软件断点实际上会改变文件的CRC,所以任何类型的程序,如一块计算其CRC的恶意软件可以改变其行为以响应设置的断点,而对于硬件断点,调试器停止并逐步执行某些代码块则不太明显。

答案 4 :(得分:1)

简而言之,硬件断点使用专用寄存器,因此数量有限。这些可以在易失性和非易失性存储器上设置。

通过使用断点指令替换RAM存储器中的指令操作码来设置软件断点。这些只能在RAM存储器中设置(Flash存储器不可写),并且不受限制。

This article provides good explanation about breakpoints.

谢谢和问候, Shivakumar V W

答案 5 :(得分:1)

观察点是指硬件处理速度 的情况:

watch var
rwatch var
awatch var

当您在GDB 7.7 x86-64上输入这些命令时,它会说:

Hardware watchpoint 2: var

x86的硬件功能在:http://en.wikipedia.org/wiki/X86_debug_register

中提到

由于现有的寻呼电路可以管理每一个存储器访问,因此很可能。

"软件"替代是single step the program非常慢。

将它与常规断点进行比较,其中至少软件实现插入和int3指令并让程序运行,因此只有在遇到断点时才支付开销。

答案 6 :(得分:1)

引用英特尔系统调试器帮助文档:

  

硬件与软件断点   调试器可以使用两种硬件   和软件断点,每一个都有优点和缺点:

     

硬件断点是使用DRx架构实现的   英特尔SDM中描述的断点寄存器。他们有   可以直接在复位时使用,非易失性和   可用于闪存或其他只读存储器。缺点是   他们是一个有限的资源。 软件断点要求   修改系统内存,因为它们是通过替换来实现的   使用特殊指令在所需位置进行操作。这使得   他们是一个无限的资源,但内存依赖意味着你不能   在模块加载到内存之前安装它们,如果是   目标软件会覆盖该内存,然后它们将变为无效。   通常,必须由调试器启用的任何调试功能   重置后不会持续存在,并且可能会受到影响   架构模式转换,例如SMM进入/退出或VM   进入/退出。具体的例子包括:

     

CPU Reset将清除所有调试功能,但重置中断除外。这个   例如,意味着用户指定的断点将无效   直到目标在重置后停止一次。请注意,此停止可以   由于重置中断或由于用户启动的暂停。在   无论哪种情况,调试器都将恢复必要的调试功能。   SMM进入/退出将禁用/重新启用断点,这意味着您   在SMRAM外部暂停时,无法在SMRAM中指定断点。如果   如果您想在SMRAM内休息,您必须先停在SMM   进入 - 中断并手动应用断点。或者你可以   在进入SMM时修补BIOS以重新启用断点,但是这样   需要能够修改无法使用的BIOS   生产代码。