2012-03-23 19 views
20

私はこのソフトウェアをSTM32組み込みシステム用にデバッグしています。機能私のプログラムの一つのブレークポイントのいくつかの並べ替えを打つ保つには:私はinfo breakpointsを行う際設定されたブレークポイントにかかわらずSIGTRAP。隠されたハードウェアブレークポイント?

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

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

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

+0

CPUをリセットします。 :)(hwブレークポイントは、gdbが終了した場合、または終了/再接続時に既存のブレークポイントをすべて削除しない場合は、インストールしたままにすることができます)。 – dbrank0

+0

デバッグレジスタは、いくつかのタイプのリセットにわたって持続する可能性があることに注意してください。フルパワーオンリセットは間違いなくそれをクリアします。 – TJD

+1

「フルパワーオンリセット」とはどういう意味ですか?私は、プラグを抜き/再挑戦しようとしましたが、ブレークポイントは持続します。 – Randomblue

答えて

18

長い答え: ハードウェアブレークポイントは、通常、いくつかの特殊なCPUレジスタに書き込むことによって設定されます。これはgdbによって行われます。 gdbが死んでも、CPUにインストールされているものはそのまま残すことができます。 あなたの実装(gdbの)は、あなたのターゲットに接続するときにそれらをクリアしたり、調べたりしないでしょう。 これらを見つけるには、ハードウェアブレークポイントレジスタの内容をCPUにリストする必要があります(STM32でこれを行う方法はわかりません)。 GDBを使用していくつかのHWブレークポイントを設定します(一般的にはわずかしかなく、8を超えることはほとんどありません)。これにより、それらのhwレジスタを上書きしてからクリーニングする必要があります。それらのブレークポイントを設定すると(それらを削除する前に)、 "continue"を実行します(gdbがその時点でのみブレークポイントを設定するため)。

+1

多くのブレークポイントを設定し、それらを削除していただきありがとうございます。それは問題を解決するはずです。私のターゲットに接続するとき、gdbがそれらのブレークポイントをクリアしないということは少し面倒です。 – Randomblue

1

あなたが実行しているコードは、SIGTRAPを呼び出す

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

が含まれていてもよいです。

2

SIGTRAPは実行中のブレークポイント命令でなければなりません。

命令ポインタを調べることでこれをデバッグすると、BKPT命令が含まれているアドレスを指している可能性が高くなります(実際のコードが何であるかを調べる必要があります)。

そこから、スタックと命令ポインタに基づいて逆方向に作業し、あなたが予想される場所にいるかどうかを確認する必要があります。これを引き起こす多くのものがあります.GDBからクリアに失敗したブレークポイント命令をメモリの破損に挿入することです。

2

以下は、私を助け:

# Ones I hit the SIGTRAP: 
(gdb) f 0 # Show the current stack frame of the current thread. 
#0 0x4003ed70 in [email protected]@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. 
+1

これは受け入れられた答えと同じ考えですが、hbreakコマンドがキーであることに注意するのは良いことです。通常のブレークコマンドは、以前のブレークポイントを上書きするのではなく、ソフトウェアブレークポイントを設定します –

0

ハードウェアブレークポイントの追加と削除した場合、割り込みベクトルをチェックし、助けにはなりません。

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

エントリのいずれかが偶数アドレスを持っている場合、ハンドラ関数は.thumb_func.TYPEディレクティブ(NXP Avoid hardfaultHardFault 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 
関連する問題