Чем отличаются int3 и ud2 при отладке x86

В машинном коде x86 встречаются однобайтовая точка останова int3 и двухбайтовая недопустимая инструкция ud2. Они останавливают выполнение, но применяются в разных сценариях и дают отладчику разные ориентиры.

Заполнение и недостижимая ветка

int3 удобно использовать для заполнения промежутков между функциями и для установки точек останова: однобайтовое кодирование позволяет сработать даже при попадании управления внутрь такого заполнения. Отладчики и разработчики часто вставляют int3 явно для возможности прерывания выполнения в нужной точке.

ud2 обычно применяется для пометки ветвей, которые по логике программы не должны выполняться — например, продолжение после вызова функции, помеченной как [[noreturn]], или в блоках с защитными проверками, где обнаружение пути к ud2 указывает на нарушение предположений о ходе выполнения. Появление ud2 чаще сигнализирует о логической ошибке или некорректной оптимизации, нежели о намеренной точке останова.

Как интерпретировать остановку

При остановке на int3 полезно сначала проверить установленные точки останова в отладчике, соседние инструкции и корректность адреса перехода — это может быть намеренная точка прерывания или следствие заполнения. При остановке на ud2 стоит проанализировать путь исполнения, который привёл к этой инструкции: нужно понять, какое предположение оказалось неверным и почему выполнена недостижимая ветка.

Эти рекомендации — ориентиры, а не однозначный диагноз. Конкретное значение остановки зависит от кода, используемого компилятора и режима сборки.