Как установить контрольную точку программного обеспечения на ARM-процессоре?
Как сделать эквивалент прерывания программного обеспечения x86:
asm( "int $3" )
на ARM-процессоре (в частности, Cortex A8) для генерации события, которое будет прерывать выполнение под gdb?
Ответы
Ответ 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.