Это удивительно нетривиальный объем работы, охватывающее многие дизайнерские решения и художественные компромиссы. Подумайте: вы отлаживаете. Дебют приостановлен. Его образ в памяти содержит объектный код источника и двоичный макет объектов, кучу, стеки. Отладчик проверяет изображение своей памяти. Он загрузил отладочную информацию о символах, типах, сопоставлениях адресов, pc (ip) в соответствие с источниками.Он отображает стек вызовов, значения данных.
Теперь вы хотите разрешить конкретный набор возможных изменений для кода и/или данных, не останавливая debuggee и перезагружая. Простейшим может быть изменение одной строки кода на другую. Возможно, вы перекомпилируете этот файл или только эту функцию или только эту строку. Теперь вам нужно исправить изображение debuggee, чтобы выполнить эту новую строку кода при следующем переходе по ней или в противном случае запустить ее. Как это работает под капотом? Что произойдет, если код больше, чем строка кода, которую он заменил? Как он взаимодействует с оптимизацией компилятора? Возможно, вы можете сделать это только на специально скомпилированном для цели отладки EnC. Возможно, вы ограничите возможные сайты, которые законны для EnC. Рассмотрим: что произойдет, если вы отредактируете строку кода в функции, приостановленной в стеке вызовов. Когда код возвращается, он запускает исходную версию функции или версию с измененной линией? Если исходная версия, откуда берется этот источник?
Можете ли вы добавить или удалить местных жителей? Что это делает для стека вызовов приостановленных кадров? Из текущей функции?
Можете ли вы изменить сигнатуры функций? Добавить поля в/удалить поля из объектов? Как насчет существующих экземпляров? Как насчет ожидающих деструкторов или финализаторов? И т. Д.
Существует множество подробных сведений о функциях, с помощью которых можно сделать любую работу по использованию EnC. Тогда есть много проблем с перекрестными инструментами, необходимых для обеспечения инфраструктуры EnC. В частности, это помогает иметь какой-то репозиторий отладочной информации, который может предоставить отладчику информацию об отладке и объекте до и после редактирования. Для C++ инкрементно обновляемая информация об отладке в PDB помогает. Инкрементальная привязка также может помочь.
С учетом экосистемы MS в экосистеме GCC легко представить сложности и проблемы интеграции в GDB/GCC/binutils, множество целей, некоторые необходимые специфические целевые абстракции EnC и «приятно иметь но несущественный характер EnC, почему он еще не появился в GDB/GCC.
Счастливый взлом!
(ps) Поучительно и вдохновляюще смотреть на то, что может сделать интерактивная среда программирования Smalltalk-80. В St80 не было понятия «перезагрузка» - изображение и его объектная память всегда были живы, если вы редактировали любой аспект класса, который вам еще нужно продолжать работать. В таких средах объектное управление версиями не было гипотетическим.)
Настоящий ответ здесь невозможен, это будет массивное пламя и приманка с нижним носом. Попробуйте programers.se и спросите о лидерских ролях в мире Foss. – 2010-12-11 22:38:28
Ханс, я искренне не понимаю твое замечание. Я считаю, что мой вопрос довольно хорошо сформирован: это конкретный вопрос о популярной инструментальной цепочке и хорошо известной функции отладчика; Я хотел бы знать, есть ли какие-либо важные технические дорожные блоки, которые останавливают людей от внедрения E & C в gcc/gdb, и есть ли какая-либо известная работа по ее реализации. – Kos 2010-12-11 23:25:48