21

x86 ソフトウェア割り込みと同等の処理を行うにはどうすればよいですか。

asm( "int $3" )

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

4

8 に答える 8

22

arm-none-eabi-gdb.exe クロス コンパイラを使用すると、これはうまく機能します (Igor の回答に感謝します)。

__asm__("BKPT");
于 2014-03-13T23:23:34.900 に答える
19

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

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

于 2012-07-05T13:55:40.107 に答える
8

このためだけに単純なライブラリ ( scott/debugbreak ) があります。

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

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

于 2015-07-07T10:28:17.920 に答える
6

__asm__ __volatile__ ("bkpt #0");

BKPT man エントリを参照してください。

于 2015-07-29T08:27:26.373 に答える
3

ARM 上の Windows の場合、__debugbreak()未定義のオペコードを利用する組み込み関数は引き続き機能します。

nt!DbgBreakPointWithStatus:
defe     __debugbreak
于 2014-09-23T08:36:13.757 に答える
2

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

ブレーキ #0

于 2019-03-04T20:24:27.233 に答える
2

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

ptrace(PTRACE_POKETEXT, pid, アドレス, 0xe7f001f0)

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

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

于 2017-08-23T12:52:22.323 に答える