有一种行之有效的方法可以检测调试器是否连接在 Cortex-M 上,如此处所示。
我曾经在调试会话中作为自动设置断点的一种方法:
void autobreak() {
if (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) {
__asm__ __volatile__ ("bkpt #0");
}
}
我在 CLion 中使用 J-Link 和 OpenOCD 进行调试。使用
autobreak()
,J-Link 会停止程序执行,而无需我在 调试模式 下手动指定断点。然而,似乎在运行模式J-Link仍然停止程序执行,这对我的应用程序来说是不希望的。
让我快速澄清一下每种模式的含义:
有没有办法检查J-Link是否在调试模式或运行模式连接?
在 cortex-m 中,在调试时我们有停止或监视模式,但是您所说的更多是关于 cpu 状态停止或运行。
您所说的代码是轮询寄存器 DHCSR 的位 0,该位只能通过来自 dap 的访问来操作,因此如果连接了外部调试器,那么它将可以通过 DAP 接口访问硬件,从而允许设置位 C_DEBUGEN 为 1,因此每当我们连接此外部探针并且在主机上有一个正在运行的会话时,该位将始终为 1,因此 cpu 是否停止,如果连接了外部调试器并且该位将始终设置为 1,并且因此,您的条件例程将始终执行,导致 cpu 停止。
避免使用调试监视器例程(在 cortex-m0/m0+ 中不可用,但在 cortex-m3/m4/m7 中可用..),其中包含内部 cpu 异常以及软件断点或预编程硬件断点执行/匹配或什至显式停止 cpu 完成,然后生成内部异常并跳转到调试监视器异常,使用此调试监视器 C_DEBUGEN 将始终为 0 并且根本不设置。