Вопрос

Я знаю, что E & C - спорная тема, и некоторые говорят, что это поощряет неправильный подход к отладке, но все же - я думаю, мы можем согласиться с тем, что существует множество случаев, когда это явно полезно - экспериментировать с различными значениями некоторых констант, перепроектировать параметры GUI "на лету", чтобы найти хороший внешний вид...Вы сами это называете.

Мой вопрос заключается в следующем: Будет ли у нас когда-нибудь E & C на GDB? Я понимаю, что это функция, зависящая от платформы, и требует серьезного сотрудничества с компилятором, отладчиком и операционной системой (В MSVC это сделать проще простого, поскольку компилятор и отладчик всегда поставляются в одном пакете), но...Это все равно должно быть выполнимо.Я даже что-то слышал о том, что Apple реализовала это в своей версии GCC [требуется цитирование].И я бы сказал, что это действительно осуществимо.

Зная всю шумиху вокруг E & C MSVC (мой опыт говорит о том, что это первое, что упоминают пользователи MSVC, когда их спрашивают "почему бы не переключиться на Eclipse и gcc / gdb"), я серьезно удивлен, что по прошествии нескольких лет GCC / GDB все еще не имеет такой функции.Есть ли для этого какие-то веские причины?Кто-нибудь работает над этим, пока мы разговариваем?

Это было полезно?

Решение

Это удивительно нетривиальный объем работы, охватывающий множество дизайнерских решений и компромиссов. Рассмотрим: вы отладки. Дебюхей приостановлен. Его изображение в памяти содержит код объекта источника и двоичный макет объектов, кучу, стеки. Отладчик проверяет изображение памяти. Он загружал отладочную информацию о символах, типах, отображениях адресов, ПК (IP) для исходных соответствий. Он отображает стек вызовов, значения данных.

Теперь вы хотите разрешить определенный набор возможных изменений в код и/или данных, не останавливая отладки и перезапустить. Самым простым может быть изменение одной строки кода на другую. Возможно, вы перекомпилируете этот файл или только эту функцию или только эту строку. Теперь вам нужно исправить изображение отладки, чтобы выполнить эту новую строку кода в следующий раз, когда вы переходите через него или иным образом проходите через него. Как это работает под капюшоном? Что произойдет, если код больше, чем строка кода, которую он заменил? Как это взаимодействует с оптимизацией компилятора? Возможно, вы можете сделать это только на специально скомпилированной для цели отладки ENC. Возможно, вы будете ограничивать возможные сайты, это законно. Подумайте: что произойдет, если вы отредактируете строку кода в функции, приостановленной в стеке вызовов. Когда код возвращает, запускает исходная версия функции или версию с измененной линейкой? Если оригинальная версия, откуда этот источник?

Вы можете добавить или удалить местных жителей? Что это делает со стеком вызовов с подвесными рамами? Текущей функции?

Можете ли вы изменить подписи функций? Добавить поля в / удалить поля из объектов? Как насчет существующих случаев? Как насчет ожидающих деструкторов или финализаторов? И т. д.

Есть много, многие функциональные данные, чтобы принять участие, чтобы сделать любые разбираемые работы. Тогда существует множество проблем интеграции с перекрестными инструментами, необходимыми для обеспечения инфраструктуры для энергопотребления. В частности, оно помогает иметь какое-то репозиторий информации отладки, которая может иметь доступную информацию о отладке ранее и после редактирования и объектный код для отладчика. Для C ++ постепенно обновляемая информация отладки в PDBS помогает. Инкрементное связывание может помочь тоже.

Глядя из экосистемы MS в экосистему GCC, легко представить проблемы сложности и интеграции в GDB/GCC/Binutils, множество целей, некоторые необходимые специальные целевые абстракции ENC и «приятно иметь, но несущественную» природу, некоторые необходимы Из ENC, почему он еще не появился в GDB/GCC.

Счастливого взлома!

(PS Поучительно и вдохновляют смотреть на то, что может сделать интерактивную программную среду SmallTalk-80. В ST80 не было понятия «перезапуска» - изображение и его память объекта всегда были живыми, если вы отредактировали любой аспект Класс, который вы все еще должны были продолжать бегать. В таких средах версию объекта не было гипотетической.)

Другие советы

Я не знаком с E & C MSVC, но в GDB есть некоторые из вещей, которые вы упомянули:

http://sourceware.org/gdb/current/onlinedocs/gdb/altering.html#altering

17. Изменение исполнения

После того, как вы думаете, вы нашли ошибку в своей программе, вы можете узнать, наверняка выяснить, будет ли исправлять очевидную ошибку привести к правильным результатам в остальной части прогона. Вы можете найти ответ по эксперименту, используя функции GDB для изменения выполнения программы.

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

Назначение: Назначение переменных
Прыгать: Продолжение по другому адресу
Сигнализация: Давая вашей программе сигнал
Возвращение: Возвращение из функции
Призыв: Вызов функций вашей программы
Исправление: Исправление вашей программы
Компиляция и инъекция кода: Компиляция и инъекция кода в GDB

Это довольно хорошая ссылка на старую реализацию Apple "исправить и продолжить".Он также ссылается на другие рабочие реализации.

http://sources.redhat.com/ml/gdb/2003-06/msg00500.html

Вот фрагмент:

Исправить и продолжить - это функция, реализованная многими другими отладчиками, которую мы добавили в нашу gdb для этого выпуска.Sun Workshop, SGI ProDev WorkShop, Microsoft Visual Studio, HP wdb и Sun's Hotspot Java Виртуальные машины - все они так или иначе предоставляют эту функцию.Я основал нашу реализацию на функции HP wdb Fix and Continue, которую они добавили несколько лет назад.Хотя моя окончательная реализация соответствует общим схемам подхода, который они использовали, между ними почти нет общего кода.Отчасти это связано с архитектурными различиями (как в процессоре, так и в ABI), но еще больше из-за различий в дизайне реализации.

Обратите внимание, что эта возможность, возможно, была удалена в более поздней версии их набора инструментов.

Обновить:21 декабря 2012 Существует Дорожная карта GDB Презентация в формате PDF, включающая слайд с описанием "Исправить и продолжить", а также другие пункты.Презентация датирована 9 июля 2012 года, так что, возможно, есть надежда добавить это в какой-то момент.Презентация была частью GNU Tools Cauldron 2012.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top