Подтвердить что ты не робот

Как установить контрольную точку программного обеспечения на ARM-процессоре?

Как сделать эквивалент прерывания программного обеспечения x86:

asm( "int $3" )

на ARM-процессоре (в частности, Cortex A8) для генерации события, которое будет прерывать выполнение под gdb?

4b9b3361

Ответ 1

ARM не определяет конкретную инструкцию точки останова. Это может быть разным в разных ОС. В ARM Linux обычно используется код UND (например, FE DE FF E7) в режиме ARM и BKPT (BE BE) в Thumb.

С компиляторами GCC вы обычно можете использовать __builtin_trap() intrinsic для создания точки останова для платформы. Другой вариант - raise(SIGTRAP).

Ответ 2

Используя перекрестный компилятор arm-none-eabi-gdb.exe, это отлично работает для меня (спасибо Игорю):

__asm__("BKPT");

Ответ 3

У меня есть простая библиотека (scottt/debugbreak) только для этого:

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

Просто скопируйте единственный заголовок debugbreak.h в свой код, и он будет корректно обрабатывать ARM, AArch64, i386, x86-64 и даже MSVC.

Ответ 4

Для Windows на ARM все еще работает instrinsic __debugbreak(), который использует код undefined.

nt!DbgBreakPointWithStatus:
defe     __debugbreak

Ответ 5

__asm__ __volatile__ ("bkpt #0");

См. BKPT man entry.

Ответ 6

В моей системе armv7hl (i.MX6q с linux 4.1.15), чтобы установить точку останова в другом процессе, я использую:

ptrace (PTRACE_POKETEXT, pid, адрес, 0xe7f001f0)

Я выбираю это значение после того, как разделил gdb:)

Это отлично работает: я могу проверить отслеживаемый процесс, восстановить исходную инструкцию и перезапустить процесс с помощью PTRACE_CONT.