【问题标题】:How to ignore interrupts with arm gdb如何使用 arm gdb 忽略中断
【发布时间】:2016-06-07 00:22:45
【问题描述】:

我正在尝试使用 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 {

【问题讨论】:

  • 您不会单步进入处理程序,但它恰好发生在您单步执行代码时。
  • 您可以尝试 finish 命令退出中断处理程序。
  • 我不确定 gdb 有没有很好的方法来做到这一点。如果UsbConfig.c 中没有您需要调试的内容,也许一种解决方法是确保在没有调试信息的情况下对其进行编译(即,编译器命令行上没有-g)。
  • finish 命令实际上不起作用。我最近修改了我的 Makefile 为 UsbConfig.c 添加了一个特定规则(没有 -g 或 -ggdb),但在调试时我仍然陷入 USB0_Handler (使用新版本)

标签: c gdb arm bare-metal


【解决方案1】:

当在单步执行过程中触发中断时,GDB 通常会停止,因为单步执行的结束位置出乎意料。

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

让你摆脱中断处理程序的最简单方法是在函数的最后一行设置断点,恢复并继续单步执行。有人建议使用完成命令,但它可能会再次失败,这取决于堆栈跟踪的质量。

由于 GDB 的可脚本性(例如在 python 中),可以通过检查 PC 来自动执行此操作,如果 PC 位于 irq 向量中的 isr 地址上,则获取返回地址,植入临时断点并恢复。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多