Я буду описывать отладку в windows. Когда мы ставим точку останова, debugger, еще до начала процесса знает на какой инструкции будет стоять эта точка останова(Это реализуется с помощью pdb файлов, в которых хранится маппинг имен переменных и IL инструкций методов, которые однозначно преобразуются байт код. Этот маппинг корректно работает при отключенных jit оптимизациях) И заменяет ее инструкцией int 3(interrupt 3).
Встречая эту инструкцию процессор генерирует прерывание, а windows exception с кодом 0X8000003. Информация об этом исключение передается процессу, совершающему отладку и тот должен ее как-то обработать.
Windows предоставляет такое API для отладки :