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