如何使用arm gdb忽略中断

adr*_*iel 6 c gdb arm bare-metal

我正在尝试使用arm-none-eabi-gdb 调试程序并逐步执行它。有一个中断 USB0_Handler,我不想在单步执行程序时进入该中断。为了实现这一点,我尝试使用skip,但它不起作用,即使我尝试跳过该函数或跳过整个文件(包含中断)。我正在使用openocd来实现对tm4c123gh6pm的远程调试。

我已经到了这样的地步:我不知道是否应该为自己定义一个 gdb 函数,或者我遗漏了一点。这是我的终端的输出:

(gdb) info skip
Num     Type           Enb What
1       function       y   USB0_Handler
(gdb) c
Continuing.

Breakpoint 2, relayTask () at ./relay.c:191
191         nextTime = rtcGetTimeIn(DEFAULT_REFRESH_RATE);
(gdb) n
USB0_Handler () at ./UsbConfig.c:326
326 {
(gdb) n
332     ui32Status = MAP_USBIntStatusControl(USB0_BASE);
(gdb) n
337     USBDeviceIntHandlerInternal(0, ui32Status);
(gdb) n
338 }
(gdb) n  #returning at the top of USB0_Handler
326 {
Run Code Online (Sandbox Code Playgroud)

Chr*_*ier 1

当单步执行时触发中断时,GDB 通常会停止,因为单步在它不期望的地方结束。

从调试器的角度来看,中断处理程序通常很难处理,因为它们是在新的上下文中执行的:堆栈帧发生了更改,除非 GDB 识别出帧中的特定模式,否则它将无法计算完整的堆栈跟踪(即中断处理程序帧+中断之前的常规程序堆栈跟踪。)

让您退出中断处理程序的最简单方法是在函数的最后一行放置一个断点,恢复并继续单步执行。有人建议使用 finish 命令,但它可能会失败,具体取决于堆栈跟踪的质量。

由于 GDB 的可脚本性(例如在 python 中),可以通过检查 PC 来实现自动化,如果 PC 位于 irq 向量中的 isr 地址上,则获取返回地址,设置临时断点并恢复。