web-dev-qa-db-ja.com

ARMプロセッサにソフトウェアブレークポイントを設定するにはどうすればよいですか?

X86ソフトウェア割り込みと同等の方法を実行するにはどうすればよいですか。

asm( "int $3" )

ARMプロセッサ(具体的にはCortex A8)で、gdbでの実行を中断するイベントを生成しますか?

16
engie

ARMは特定のブレークポイント命令を定義していません。 OSによって異なる場合があります。 ARM Linuxでは、通常、ARMモードではUNDオペコード(例:_FE DE FF E7_)、ThumbではBKPT(_BE BE_)です。

GCCコンパイラでは、通常、__builtin_trap()組み込み関数を使用してプラットフォーム固有のブレークポイントを生成できます。別のオプションはraise(SIGTRAP)です。

18
Igor Skochinsky

Arm-none-eabi-gdb.exeクロスコンパイラを使用すると、これは私にとってうまく機能します(Igorの回答のおかげで):

__asm__("BKPT");
14

__asm__ __volatile__ ("bkpt #0");

[〜#〜] bkpt [〜#〜] manentryを参照してください。

5
Benoit

私はこれのためだけに単純なライブラリ( scottt/debugbreak )を持っています:

#include <debugbreak.h>
...
debug_break();

単一のdebugbreak.hヘッダーをコードにコピーするだけで、ARM、AArch64、i386、x86-64、さらにはMSVCを正しく処理できます。

5
scottt

ARM上のWindowsの場合、未定義のオペコードを利用する本質的な__debugbreak()は引き続き機能します。

nt!DbgBreakPointWithStatus:
defe     __debugbreak
2
Thomson

ブレークポイントinstを使用できます:

  • A32の場合: BRK #imm 命令を使用します

  • 腕と親指の場合: BKPT #imme 命令を使用します。

または、 [〜#〜] und [〜#〜] 疑似命令を使用して未定義の命令を生成し、プロセッサが実行しようとすると例外が発生する可能性があります。

2
J1ngB0

元の質問はARMv7-AであるCortex-A7について尋ねましたが、ARMv8ではGDBは

brk#

1
Olsonist

私のarmv7hl(Linux 4.1.15を使用するi.MX6q)システムでは、別のプロセスにブレークポイントを設定するために、次を使用します。

ptrace(PTRACE_POKETEXT、pid、address、0xe7f001f0)

Gdbをstraceした後にその値を選択します:)

これは完全に機能します。トレースされたプロセスを調べ、元の命令を復元し、PTRACE_CONTを使用してプロセスを再開できます。

1