Это удивительно нетривиальный объем работы, охватывающий множество дизайнерских решений и компромиссов между функциями. Подумайте: вы отлаживаете. Дебютант отстранен Его изображение в памяти содержит объектный код источника и двоичное расположение объектов, кучу, стеки. Отладчик проверяет свой образ памяти. Он загрузил отладочную информацию о символах, типах, отображениях адресов, pc (ip) в исходные соответствия. Отображает стек вызовов, значения данных.
Теперь вы хотите разрешить определенный набор возможных изменений кода и / или данных без остановки отладчика и перезапуска. Самым простым может быть изменение одной строки кода на другую. Возможно, вы перекомпилируете этот файл или только эту функцию или только эту строку. Теперь вам нужно пропатчить образ отладчика для выполнения этой новой строки кода при следующем шаге по нему или иным образом через него. Как это работает под капотом? Что происходит, если код больше строки кода, которую он заменил? Как это взаимодействует с оптимизацией компилятора? Возможно, вы можете сделать это только на специально скомпилированной для EnC цели отладки. Возможно, вы ограничите возможные сайты - это законно для EnC. Подумайте: что произойдет, если вы отредактируете строку кода в функции, приостановленной в стеке вызовов. Когда код возвращается туда, запускается ли оригинальная версия функции или версия с вашей строкой изменилась? Если оригинальная версия, откуда этот источник?
Можете ли вы добавлять или удалять местных жителей? Что это делает со стеком вызовов приостановленных кадров? Из текущей функции?
Можете ли вы изменить сигнатуры функций? Добавить поля / удалить поля из объектов? Как насчет существующих экземпляров? Что насчет деструкторов или финализаторов? И т.д.
Есть много, много функциональных деталей, которые нужно учитывать, чтобы заставить работать любой удобный EnC. Кроме того, возникает много проблем интеграции между инструментами, необходимых для обеспечения инфраструктуры для обеспечения EnC. В частности, это помогает иметь некоторый репозиторий отладочной информации, который может сделать доступными отладочную информацию до и после редактирования и объектный код для отладчика. Для C ++ помогает постепенно обновляемая отладочная информация в PDB. Инкрементные ссылки также могут помочь.
Глядя из экосистемы MS в экосистему GCC, легко представить сложность и проблемы интеграции в GDB / GCC / binutils, множество целей, некоторые необходимые абстракции целей, специфичные для EnC, и "приятно иметь, но несущественная "природа EnC, вот почему она еще не появилась в GDB / GCC.
Счастливого взлома!
(ps. Поучительно и вдохновляюще взглянуть на то, на что способна среда интерактивного программирования Smalltalk-80. В St80 не было понятия «перезапуск» - изображение и его память объекта всегда были живыми, если вы редактировали какой-либо аспект класса, который вы все еще должны были продолжать. В таких средах управление версиями объектов не было гипотетическим.)