ISA x86 включает однобайтовую кодировку int3
, предназначенную для программных точек останова. GDB использует это (через ptrace) по умолчанию для точек останова.
( Почему Single Stepping Instruction на X86? )
x86 также имеет флаг прерывания (TF) в EFLAGS для одношагового режима. (https://en.wikipedia.org/wiki/Trap_flag). См. Также Разница между флагом прерывания (TF) и флагом прерывания монитора?
Существуют даже "регистры отладки" для установки аппаратных точек останова, без изменения машинного кода на быть запущенным А также аппаратная поддержка точек наблюдения, для прерывания записи на определенный адрес. Это делает точки наблюдения GDB эффективными, не требуя от него одношагового и ручного декодирования инструкции, чтобы увидеть, где она пишет.
https://wiki.osdev.org/CPU_Registers_x86#Debug_Registers
Реализация аппаратные точки останова, использующие регистр отладки x86 ветка форума osdev может быть уместна.
Некоторые другие ISA существуют почти без поддержки HW для отладки. например, без одношагового флага, отладчику, возможно, придется всегда декодировать текущую инструкцию (на которую указывает счетчик программ), чтобы найти следующую выполняемую команду, и установить там программную точку останова.
ARM Linux Раньше это делалось для реализации ptrace
одношагового, но этот код дизассемблера был удален из ядра и теперь просто возвращает -EIO
. https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=425fc47adb5bb69f76285be77a09a3341a30799e - это коммит, который удалил его.