x86 ソフトウェア割り込みと同等の処理を行うにはどうすればよいですか。
asm( "int $3" )
ARM プロセッサ (具体的には Cortex A8) で、gdb の下で実行を中断するイベントを生成しますか?
arm-none-eabi-gdb.exe クロス コンパイラを使用すると、これはうまく機能します (Igor の回答に感謝します)。
__asm__("BKPT");
ARM は、特定のブレークポイント命令を定義していません。OS によって異なる場合があります。ARM Linux では、通常、ARM モードでは UND オペコード (例: ) 、ThumbFE DE FF E7
では BKPT ( ) です。BE BE
GCC コンパイラでは、通常、組み込みを使用__builtin_trap()
してプラットフォーム固有のブレークポイントを生成できます。別のオプションはraise(SIGTRAP)
.
このためだけに単純なライブラリ ( scott/debugbreak ) があります。
#include <debugbreak.h>
...
debug_break();
1 つのヘッダーをコードにコピーするだけdebugbreak.h
で、ARM、AArch64、i386、x86-64、さらには MSVC を正しく処理できます。
__asm__ __volatile__ ("bkpt #0");
BKPT man エントリを参照してください。
ARM 上の Windows の場合、__debugbreak()
未定義のオペコードを利用する組み込み関数は引き続き機能します。
nt!DbgBreakPointWithStatus:
defe __debugbreak
元の質問では ARMv7-A である Cortex-A7 について尋ねましたが、ARMv8 では GDB が使用します
ブレーキ #0
私のarmv7hl(Linux 4.1.15のi.MX6q)システムで、別のプロセスにブレークポイントを設定するには、次を使用します:
ptrace(PTRACE_POKETEXT, pid, アドレス, 0xe7f001f0)
gdb を strace した後にその値を選択します :)
これは完全に機能します。トレースされたプロセスを調べ、元の命令を復元し、PTRACE_CONT でプロセスを再開できます。