ハードウェア ブレークポイントのほかに、ソフトウェア ブレークポイントを使用してデバッガーに侵入できます。デバッガーは、コードが RAM に配置されている場合にのみこれをサポートします。これは多くの場合、まったく実用的ではありません。
ライフハックとして、代わりにできることbreakpoint()
は、ハードウェア ブレークポイントを含む関数を作成することです。この関数が呼び出されると、ブレークポイントがアクティブになります。
void __attribute__ ((noinline)) breakpoint()
{
__asm("NOP"); // <---- set a hardware breakpoint here!
// hello, please Step Out to go to caller location (ex: press Shift-F11)
}
void main()
{
int x = 1;
breakpoint(); // break into the debugger
printf("%d\n", x);
x += 2;
breakpoint(); // break into the debugger, again
printf("%d\n", x);
}
デバッガーは 内で停止しますbreakpoint()
。ブレークポイントの実際の位置を確認するには、ステップ アウトする必要があります。
この手法により、ハードウェア ブレークポイントがシングル ステップなどの対話用に解放され、多くの場合、4 つのブレークポイントで十分です。
ノート:
breakpoint()
関数の代わりに__asm("BKPT #0")
、デバッガーに入る を使用することもできます。残念ながら、この命令をステップ オーバーする方法はありません (STM32/GDB でテスト済み) ため、実質的に HALT 命令のように動作します。フォルト状態または未使用の割り込み内にブレークポイントを配置するために使用できます。
- が省略された場合、
breakpoint()
関数は一度だけ機能するようです__asm("NOP");
- STM8に関しては、例外的にバイト更新をサポートするフラッシュメモリを備えているため、RAMと非常によく似た方法で動作できます. デバッガーはこれを使用して、ソフト ブレークポイントを必要なだけ挿入できます。
- ただし、STM8 には 2 つのブレークポイント レジスタしかありませんが、これらはおそらく単一のステッピング専用に使用されます。
- 他のより強力な ARM Cortex MCU は、6 つまたは 8 つのハードウェア ブレークポイントを持つことができます。
- GDB (および他のデバッガー) は、ブレークポイントを処理する方法が少し賢くなる可能性があります。たとえば、関数に複数のブレークポイントがある場合、その上のブレークポイントに到達する前に、いくつかのブレークポイントに到達することができないことがよくあります。これは、特定の一般的なデバッグ シナリオで大いに役立つ可能性があります。