Это возможно сделать, только запустив программу и наблюдая, какие фактические инструкции отправляются в ЦП. Это можно сделать, например, на виртуальной машине VMware, которая позволяет выполнять отладку на уровне команд ЦП с хоста. Для этой цели есть даже плагин Visual Studio. Обычный старый отладчик будет работать, если у вас хватит терпения пошагово пройти код на уровне инструкций; однако отладчик не позволит вам разбить определенный код операции или диапазон кода операции.
Программы могут выдавать собственные инструкции, которые должны выполняться во время выполнения, которые не включены в разделы кода исполняемого файла. Если бы не такое поведение, интерпретируемые языки, такие как Java, .NET и JavaScript, были бы ужасно медленными. Позволяя писать код во время выполнения, высокоуровневые языки сценариев могут быть скомпилированы в собственный код и динамически сохранены в ОЗУ, в то же время настраивая код для наиболее быстрого выполнения в реальных случаях использования приложения (например, если определенная ветвь никогда не используется , удалите эту ветку из собственного кода). Это называется JIT-компиляцией.
Даже некоторые нативные программы делают что-то похожее на JIT-компиляцию, в том смысле, что необработанный код в двоичном файле на диске может быть совместим вплоть до 486, но программа будет динамически определять, на каком процессоре она работает, и генерировать код для запустить на этом процессоре или использовать некоторый код из раздела "data" двоичного файла в качестве исполняемого кода.
Вот почему традиционный отладчик, такой как gdb
, не позволит вам использовать конкретный код операции или инструкцию по сборке. Полуэффективное решение этой проблемы, вероятно, будет включать в себя некоторый тип виртуальной машины, поскольку гипервизор может точно видеть, какой код выполняется гостем с гипервизором, и предоставлять его в качестве вывода в программу или пользовательский интерфейс на хосте.