Редактировать и продолжить на GDB - PullRequest
20 голосов
/ 29 ноября 2010

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

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

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

Ответы [ 3 ]

16 голосов
/ 14 декабря 2010

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

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

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

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

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

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

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

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

11 голосов
/ 29 ноября 2010

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

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

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

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

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

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

3 голосов
/ 25 августа 2012

Это довольно хорошая ссылка на старую реализацию 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 Fix and Continue, которую они добавили несколько лет назад.Хотя моя окончательная реализация следует общим принципам подхода, который они выбрали, между ними почти нет общего кода.Отчасти это происходит из-за архитектурных различий (как процессора, так и ABI), но еще больше из-за различий в реализации.

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

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

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