プログラムでGCCからデバッガーに侵入することは可能ですか?
たとえば、次のようなものが必要です
#define STOP_EXECUTION_HERE ???
。コード行に配置すると、デバッガーはそこで強制的に停止します。それは可能ですか?いくつかの解決策を見つけましたが、組み込みARMシステムにはがないため、使用できませんsignal.h
。
(ただし、インラインアセンブリは使用できます)。
あなたがやろうとしていることはソフトウェアブレークポイントと呼ばれています
実際にどのようにデバッグするかを知らずに正確に言うことは非常に困難です。組み込みシステムがgdbstubを実行していると思います。これをサポートする方法にはさまざまな可能性があります。
専用のBKPT命令を使用する
これは、ソフトウェアブレークポイントをサポートするためのシステムとデバッガーの標準的な方法である可能性があります
無効な命令をCPUにフィードする
gdbstubは、独自のUNDEF
ARMモードハンドラーを配置することができます。このルートを使用する場合は、命令サイズが異なるため、現在のCPUモード(ARMまたはTHUMB)に注意する必要があります。未定義の命令の例:
ARM: 0xE7F123F4
THUMB: 0xDE56
ランタイムでは、CPUモードはPCレジスタの最下位ビットから見つけることができます。しかし、より簡単な方法は、ソフトウェアブレークポイントを配置したオブジェクトファイルをどのようにコンパイルしたかを知ることです。
SWI命令を使用する
RealViewICEを使用したときにそうしました。組み込みシステムでOSを実行している場合、これはほとんどの場合当てはまりません。SWIは通常、システムコールを実装するためにOSによって使用されます
通常、これを行う最良の方法は、デバイスのツールチェーンに付属しているライブラリ関数を使用することです。
テストすることはできませんが、一般的な解決策はARMBKPT
命令を挿入することかもしれません。デバッガーが解釈する可能性のある即時の引数を取り、結果が奇妙になる可能性があります。
GDBからアプリケーションを実行し、コード呼び出しで実行できますabort
。これにより、その時点でアプリケーションが停止します。それでも続けられるかどうかはわかりません。