SIGTRAP 尽管没有设置断点;隐藏硬件断点?

Posted

技术标签:

【中文标题】SIGTRAP 尽管没有设置断点;隐藏硬件断点?【英文标题】:SIGTRAP despite no set breakpoints; hidden hardware breakpoint? 【发布时间】:2012-04-07 22:02:17 【问题描述】:

我正在为 STM32 嵌入式系统调试这个软件。在其中一个函数中,我的程序不断遇到某种断点:

SIGTRAP,跟踪/断点陷阱

但是,在 GDB 中,当我执行 info breakpoints 时,我得到 No breakpoints or watchpoints。断点实际上对应于我很久以前在另一个版本的可执行文件中设置的断点。当我设置断点时,GDB 告诉我automatically using a hardware breakpoint on read-only memory(或类似的消息)。

我认为硬件断点仍然在我的芯片上,尽管已经加载了新版本的软件。如果确实存在虚假断点,如何定位并移除?

【问题讨论】:

重置 CPU。 :) (如果 gdb 死掉或者它在退出/重新连接时没有删除所有现有断点,则可以保留安装硬件断点)。 请注意,调试寄存器可能会在某些类型的复位中持续存在。不过,完全开机重置肯定会清除它。 “完全上电复位”是什么意思?我试过拔掉/重新插入,但断点仍然存在。 所以,如果我理解的话,你已经在你的嵌入式系统上循环了电源(并且没有备用电池),关闭了你的 jtag 接口/ICE 的电源并且断点仍然被命中? @dbrank0:是的。好吧,至少 GDB 告诉我我有一个 SIGTRAP,我将其解释为断点。 【参考方案1】:

好的。长答案: 硬件断点通常通过写入一些特殊的 CPU 寄存器来设置。这是由 gdb 完成的。如果 gdb 死了,它可以将那些安装在 CPU 中。 我猜您的(gdb)实现在连接到您的目标时不会清除或检查这些。 要找到它们,您需要列出 CPU 上硬件断点寄存器的内容(不知道如何在 STM32 上执行此操作)。解决方法是(有根据的猜测)是这样的:使用 gdb 设置几个硬件断点(通常只有几个,很少超过 8 个),然后将它们全部删除。这应该覆盖然后清理那些硬件寄存器。一旦你设置了这些断点(在删除它们之前),请执行“继续”(以防万一,因为 gdb 只在那个时候设置断点)。

【讨论】:

感谢您设置许多断点,然后删除它们的想法。那应该可以解决问题。有点烦人的是 gdb 在连接到我的目标时没有清除这些断点。【参考方案2】:

以下对我有帮助:

# Ones I hit the SIGTRAP:
(gdb) f 0  # Show the current stack frame of the current thread.
#0  0x4003ed70 in pthread_create@@GLIBC_2.4 () from /opt/CodeSourcery/arm-2011.09/arm-none-linux-gnueabi/libc/lib/libpthread.so.0

# The fragment of interest is the current address: 0x4003ed70.
# Set the hardware assisted breakpoint at the current address:
(gdb) hbreak *0x4003ed70

# Continue execution (without hitting SIGTRAP):
(gdb) c
# Continuing.

【讨论】:

这与接受的答案相同,但需要注意的是 hbreak 命令是关键。正常的 break 命令会设置软件断点,而不是覆盖之前的断点【参考方案3】:

SIGTRAP 应该是正在运行的断点指令。

通过检查您的指令指针来调试它,它很可能指向包含 BKPT 指令的地址(您必须查看实际代码是什么)。

从那里你必须根据堆栈和指令指针向后工作,看看你是否在你期望的位置。导致这种情况的原因可能有很多,从 GDB 插入无法清除的断点指令到内存损坏。

【讨论】:

【参考方案4】:

您正在运行的代码可能包含

int $0x03 ; talking about x86, don't know STM32 mnemo

调用 SIGTRAP。

【讨论】:

【参考方案5】:

如果添加和删除硬件断点没有帮助,请检查中断向量。

在 Cortex-M 微控制器上,所有处理程序条目都应该有一个奇数地址 (ARM Cortex-M FAQ)。如果没有,则触发 INVSTATE 类型的 UsageFault 并停止 MCU。 GDB 将此解释为 SIGABRT。

如果其中一个条目具有偶数地址,则检查处理函数是否具有 .thumb_func.type 指令(NXP Avoid hardfault、HardFault and .thumb_func) .

HardFault_Handler 示例:

.thumb_func
.type HardFault_Handler, %function
HardFault_Handler:
  TST LR, #4
  ITE EQ
  MRSEQ R0, MSP
  MRSNE R0, PSP
  B hard_fault_handler_c

【讨论】:

以上是关于SIGTRAP 尽管没有设置断点;隐藏硬件断点?的主要内容,如果未能解决你的问题,请参考以下文章

ida中怎样设置硬件断点的快捷键

使用GDB进行断点调试

int3和断点

硬件断点陷阱和JTAG

OD调试器断点——条件断点

断点 相关技术与原理