Подтвердить что ты не робот

Редактирование и продолжение в GDB

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Взглянув с экосистемы MS на экосистему GCC, легко представить сложности и проблемы интеграции в GDB/GCC/binutils, множество целей, некоторые необходимые специфические целевые абстракции EnC и "приятно иметь, но несущественный" характер EnC, почему он еще не появился в GDB/GCC.

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

(ps) Поучительно и вдохновляюще смотреть на то, что может сделать интерактивная среда программирования Smalltalk-80. В St80 не было понятия "перезагрузка" - изображение и его память объекта всегда были живы, если вы редактировали какие-либо аспект класса, который вам еще нужно продолжать работать. В таких средах объектное управление версиями не было гипотетическим.)

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

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

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