Как лучше всего сделать паузу «Zfs send via PV» и возобновление

Я не понимаю его реального значения

Давайте посмотрим, как это вызвано и использовал.

Основной причиной 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 байта, она могла бы перезаписать несколько инструкций, что было бы беспорядочно.

3
18.12.2017, 23:31
0 ответов

Теги

Похожие вопросы