硬件和软件断点之间有什么区别?
硬件断点是否比软件断点更快,如果是,那么如何,以及为什么我们需要软件断点呢?
答案 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)允许使用断点指令重新编程闪存,并且即使在调试位于闪存中的程序时也允许无限数量的(软件)断点。
答案 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 生产代码。