2010-11-29 2 views
19

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

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

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

+0

Настоящий ответ здесь невозможен, это будет массивное пламя и приманка с нижним носом. Попробуйте programers.se и спросите о лидерских ролях в мире Foss. – 2010-12-11 22:38:28

+1

Ханс, я искренне не понимаю твое замечание. Я считаю, что мой вопрос довольно хорошо сформирован: это конкретный вопрос о популярной инструментальной цепочке и хорошо известной функции отладчика; Я хотел бы знать, есть ли какие-либо важные технические дорожные блоки, которые останавливают людей от внедрения E & C в gcc/gdb, и есть ли какая-либо известная работа по ее реализации. – Kos 2010-12-11 23:25:48

ответ

15

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

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

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

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

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

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

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

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

11

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

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

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

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

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

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

3

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

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

Вот отрывок:

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

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

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