Я не понимаю его реального значения
Давайте посмотрим, как это вызвано и использовал.
Основной причиной SIGTRAP является инструкция
int3
.Мы можем проверить это с помощью:
int main() { asm("int3"); return 0; }
, который при запуске выводит:
Trace/breakpoint trap (core dumped)
и имеет статус выхода
133
= 128 + 5, то есть сигнал 5, SIGTRAP.GDB вставляет инструкцию
int3
в текстовый сегмент, устанавливаетptrace
и позволяет программе работать. Когда он попадает вint3
,ptrace
пробуждает родителя, который может отслеживать состояние ребенка.Обратите внимание, что существуют также аппаратные точки останова, у которых есть другой механизм: В чем разница между аппаратными и программными точками останова? | Stack Overflow
Подробнее о int3
int3
имеет две кодировки:
- обычный префикс
int
+3
, занимающий 2 байта,int 3
в NASM- специальное кодирование длиной 1 байт,
int3
в NASMКодирование длиной в один байт является фундаментальным для GDB. Если бы инструкция была больше 1 байта, она могла бы перезаписать несколько инструкций, что было бы беспорядочно.