在实时系统里,调试器暂停一个任务时,其他任务可能仍然需要运行。任务级调试的难点,不只是让断点命中,而是让暂停、恢复与系统状态保持一致。

先明确调试对象

线程、任务、进程和 CPU 是不同的对象。进程拥有地址空间,任务拥有执行上下文,CPU 则是上下文运行的位置。在设计调试入口时,要分别标识地址空间与任务,不能只凭一个代码地址决定停止谁。

断点命中,只是第一步

软件断点会临时替换目标指令。如果多个任务共享代码,非目标任务也可能经过这个地址。调试代理必须识别当前任务、断点归属和恢复方式,并正确维护原始指令。具体策略取决于系统的调度模型和调试模式。

连接目标 → 选择任务 → 设置断点
命中异常 → 确认归属 → 上报停止原因
恢复原指令 → 控制单步 → 恢复执行

Non-stop 需要清晰的状态机

Non-stop 模式允许不同被调试线程处于不同执行状态。停止通知、继续命令、线程退出和连接断开都可能交错发生。应明确每一种状态转换由谁发起、由谁确认,以及调试器断开后系统应如何处理仍然存在的断点。

架构差异不能藏在公共逻辑里

ARM、AArch64、RISC-V 与 LoongArch 的寄存器布局、异常语义和指令编码并不相同。公共层负责会话和任务管理,架构层负责断点编码、上下文转换与单步支持。ARM/Thumb 混合代码还需要正确识别指令状态和长度。

调试能力的完整性,要看一次完整的连接、暂停、恢复和退出,而不只是断点是否命中。