Це можна зробити лише запустивши програму і дотримуючись, які фактичні вказівки надсилаються до центрального процесора. Це можна зробити, наприклад, у віртуальній машині VMware, яка дозволяє налагоджувати на рівні інструкцій ЦП від хоста. Для цього є навіть плагін Visual Studio. Звичайний старий налагоджувач спрацює, якщо у вас є терпіння зробити один крок через код на рівні інструкцій; однак, налагоджувач не дозволить вам порушити конкретний діапазон коду чи опкоду.
Програми можуть випромінювати власні інструкції, що виконуються під час виконання, які не входять у розділи коду виконуваного файлу. Якби не така поведінка, інтерпретовані мови, такі як Java, .NET та JavaScript, були б жахливо повільними. Дозволяючи писати код під час виконання, мови сценаріїв високого рівня можна компілювати в нативний код і зберігати в оперативній пам’яті динамічно, одночасно налаштовуючи код на швидкий запуск у фактичних випадках використання додатків (наприклад, якщо певна гілка ніколи не береться , видаліть цю гілку з нативного коду). Це називається компіляцією JIT.
Навіть деякі вітчизняні програми роблять щось подібне до компіляції JIT, тому що необроблений код у двійковому на диску може бути сумісним аж до 486, але програма динамічно визначатиме, на якому процесорі працює, і або генерує код для запустити на цьому процесорі або використовувати якийсь код, що знаходиться у розділі "дані" двійкового файлу як виконуваного коду.
Ось чому традиційний налагоджувач подібний gdb
не дозволить вам перерватися на певний опкод або інструкцію по збірці. Напівавтоматичне рішення цієї проблеми, ймовірно, передбачає певний тип віртуальної машини, оскільки гіпервізор може точно визначити, за яким кодом працює гіперпровізований гість, і забезпечити це як вихід до програми або користувальницького інтерфейсу на хості.