debugging - 嵌入式系统中的硬件断点与软件断点

标签 debugging embedded interrupt breakpoints jtag

我的理解是插入软件断点涉及用软件中断指令替换要执行的代码中的下一条指令,该指令将导致 CPU 在到达该指令时停止。

硬件断点涉及将要执行的断点之后的下一条指令的地址放入寄存器中,本地址匹配时,通过使用硬件比较器,这将导致 CPU 停止(如果我错了,请纠正我)。

我感到困惑的是,例如,在使用硬件调试器通过 JTAG 调试电路板时,我们是否只使用硬件断点?或者 JTAG 也可以使用软件断点吗?

GDB 仅与软件断点一起使用,还是也可以与 JTAG 结合使用?对不起,如果问题有点宽泛。

最佳答案

"correct me if I'm wrong"



断点设置在指令上,而不是在它之后 - 中断发生在指令执行之前,而不是之后 - 否则在跳转、调用或分支指令上设置断点将失败。

"do we only use hardware breakpoints when using a hardware debugger to debug a board via JTAG for example?"



JTAG 是片上调试的简单通信接口(interface)(并用于其他目的,例如在线存储器和 FPGA 编程和边界扫描)。

例如,虽然它可能因 ARM Cortex-M 上的架构而异,但您可以从目标代码访问片上调试寄存器并设置硬件断点。 Yoiu 还可以使用 BKPT 指令(而不是您建议的 SWI)在您的代码中放置软件断点。

Or can JTAG use software breakpoints also?



正如我所说,JTAG只是片上调试的通信接口(interface),但是通过片上调试,您可以直接设置任何RAM内容,因此运行在开发主机上的JTAG连接的调试器软件可以临时修改RAM中的代码设置软件断点(通过用 BKPT 替换目标指令,然后当断点被击中时,恢复到原始指令以便它可以执行。软件断点对于从 ROM 运行的代码并不是那么简单,尽管一些调试器支持无限制的 ROM 断点(有价) - 此类硬件的制造商不一定会宣传他们用于执行此操作的方法。

在 JTAG 和片上调试在低端器件上广泛使用之前,使用了在线仿真和 ROM 仿真器等技术。这些通常是昂贵且复杂的解决方案。

Is GDB only used with software breakpoints, or can it be used also in conjunction with JTAG?



GDB 可以以多种方式使用。它需要一个“调试 stub ”——一个将调试器软件映射到可用硬件的软件层——其性质将取决于所使用的调试接口(interface)和目标设备。例如,当使用 UART 或以太网端口时, stub 实际上是在目标本身上运行的代码(例如 Linux 的 gdbserver )。在这种情况下,它不太可靠,因为软件错误可能会阻止调试端口驱动程序实际运行,尤其是在缺乏 MMU 保护的目标中。更简单的 JTAG 设备通过运行在开发主机上的 stub 与 GDB 接口(interface),例如常用的 OpenOCD 软件。更昂贵的 JTAG 调试硬件可能会在 JTAG 硬件本身上运行 stub ——例如 Abatron 的 bdi2000。无论哪种方式,调试 stub 都可以根据目标功能使用硬件和软件断点。

关于debugging - 嵌入式系统中的硬件断点与软件断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55621838/

相关文章:

javascript - 不断收到语法错误 : missing ) after argument list

c - 8字节的按位转置

linux - linux (arm) 中的 GPIO pin 中断处理程序

bios中断调用所需的堆栈大小

debugging - 处理神物

linux - 如何在不单步执行的情况下确定程序从何处跳转到无效地址?

c++ - 如何在 Visual Studio 2010 中查看二维数组的所有元素?

browser - 有没有适用于触摸屏设备的开源浏览器?

testing - 日志的大统一理论

java - 连接多个线程并处理泄漏的输出