web-dev-qa-db-ja.com

ブレークポイントが設定されていないにもかかわらず、SIGTRAP。隠されたハードウェアブレークポイント?

私はSTM32組み込みシステム用にこのソフトウェアをデバッグしています。関数の1つで、私のプログラムはある種のブレークポイントにヒットし続けます。

SIGTRAP、トレース/ブレークポイントトラップ

ただし、GDBでは、info breakpoints私はNo breakpoints or watchpoints。ブレークポイントは、実際には、実行可能ファイルの別のバージョンで、かなり前に設定したブレークポイントに対応しています。そのブレークポイントを設定すると、GDBはautomatically using a hardware breakpoint on read-only memory(または同様のメッセージ)。

新しいバージョンのソフトウェアをロードしたにもかかわらず、ハードウェアブレークポイントがチップに残っていると思います。実際に偽のブレークポイントがある場合、どうすればそれを見つけて削除できますか?

25
Randomblue

OK。長い答え:ハードウェアブレークポイントは通常、いくつかの特別なCPUレジスタに書き込むことによって設定されます。これはgdbによって行われます。 gdbが停止すると、CPUにインストールされたままになる可能性があります。 (gdbの)実装は、ターゲットに接続するときに、それらをクリアしたり調べたりしないと思います。それらを見つけるには、CPU上のハードウェアブレークポイントレジスタの内容を一覧表示する必要があります(STM32でこれを行う方法がわかりません)。回避策は(情報に基づいた推測)次のようになります。gdbを使用してHWブレークポイントをいくつか設定し(通常は数個しかなく、8個を超えることはめったにありません)、それらをすべて削除します。これにより、これらのハードウェアレジスタが上書きされてからクリーンアップされます。これらのブレークポイントを(削除する前に)設定したら、「続行」を実行します(念のため、gdbはその時点でのみブレークポイントを設定します)。

21
dbrank0

以下は私を助けました:

# 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.
4
Robin Kuzmin

SIGTRAPは、実行中のブレークポイント命令である必要があります。

命令ポインタを調べてこれをデバッグします。おそらく、BKPT命令を含むアドレスを指しています(実際のコードを調べる必要があります)。

そこから、スタックと命令ポインターに基づいて逆方向に作業し、目的の場所にいるかどうかを確認する必要があります。これには、GDBがクリアに失敗したブレークポイント命令を挿入することから、メモリの破損まで、さまざまな原因が考えられます。

3
dragonx

ハードウェアブレークポイントの追加と削除が役に立たない場合は、割り込みベクタを確認してください。

Cortex-Mマイクロコントローラーでは、すべてのハンドラーエントリのアドレスが奇数である必要があります( ARM Cortex-M FAQ )。そうでない場合は、タイプINVSTATEのUsageFaultがトリガーされ、MCUが停止します。 GDBはこれをSIGABRTとして解釈します。

エントリの1つに偶数のアドレスがある場合は、ハンドラ関数に。thumb_funcおよび。typeがあるかどうかを確認します。 ディレクティブ( NXPハードフォールトを回避ハードフォールトおよび.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
1
Sussch

実行しているコードに含まれている可能性があります

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

sIGTRAPを呼び出します。

1
iehrlich