簡體   English   中英

SIGTRAP 盡管沒有設置斷點; 隱藏硬件斷點?

[英]SIGTRAP despite no set breakpoints; hidden hardware breakpoint?

我正在為 STM32 嵌入式系統調試這塊軟件。 在其中一個函數中,我的程序不斷遇到某種斷點:

SIGTRAP,跟蹤/斷點陷阱

但是,在 GDB 中,當我執行info breakpoints我得到No breakpoints or watchpoints 該斷點實際上對應於我很久以前在另一個版本的可執行文件中設置的斷點。 當我設置該斷點時,GDB 會automatically using a hardware breakpoint on read-only memory告訴我automatically using a hardware breakpoint on read-only memory (或類似消息)。

我認為硬件斷點仍然在我的芯片上,盡管加載了新版本的軟件。 如果確實存在虛假斷點,我該如何定位並刪除它?

好的。 長答案:硬件斷點通常是通過寫入一些特殊的 CPU 寄存器來設置的。 這是由 gdb 完成的。 如果 gdb 死了,它可以留下那些安裝在 CPU 中的。 我猜你的實現(gdb)在連接到你的目標時既沒有清除也沒有檢查它們。 要找到它們,您需要列出 CPU 上硬件斷點寄存器的內容(不知道如何在 STM32 上執行此操作)。 解決方法是(知情的猜測)是這樣的:使用 gdb 設置幾個硬件斷點(通常只有幾個,很少超過 8 個),然后將它們全部刪除。 這應該覆蓋然后清理這些硬件寄存器。 一旦你設置了這些斷點(在刪除它們之前),做“繼續”(以防萬一,因為 gdb 只在那個時候設置斷點)。

以下幫助了我:

# 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.

SIGTRAP 應該是正在運行的斷點指令。

通過檢查您的指令指針來調試它,它很可能指向包含 BKPT 指令的地址(您必須查找實際代碼是什么)。

從那里你必須根據堆棧和指令指針向后工作,看看你是否在你期望的地方。 可能有很多原因導致這種情況,從 GDB 插入未能清除的斷點指令到內存損壞。

如果添加和刪除硬件斷點沒有幫助,請檢查中斷向量。

在 Cortex-M 微控制器上,所有處理程序條目都應該有一個奇數地址( ARM Cortex-M FAQ )。 如果沒有,則觸發類型為 INVSTATE 的 UsageFault 並暫停 MCU。 GDB 將此解釋為 SIGABRT。

如果條目之一具有偶數地址,則檢查處理函數是否具有.thumb_func.type指令( NXP 避免 hardfaultHardFault 和 .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

您正在運行的代碼可能包含

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

它調用一個 SIGTRAP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM