Как вернуться в отладчик Eclipse?

129

Можно ли выполнить обратное выполнение в отладчике Eclipse? Текущий проект, над которым я работаю, требует минимум 5 секунд для чтения и инициализации данных из файла, прежде чем что-либо будет сделано. Если я перешагну через отладчик, мне придется завершить программу и перезапустить, а это займет довольно много времени.

Джейсон
источник

Ответы:

136

Вы можете использовать команду Eclipse drop to frame, чтобы повторно ввести текущий метод сверху. Но он не будет разворачивать какие-либо произошедшие изменения состояния, поэтому он может не работать в зависимости от того, каким методом вы пользуетесь.

Еще один действительно крутой инструмент, который действительно позволяет вам делать шаг назад и вперед во времени, - это Omniscient Debugger . Он работает, инструментируя классы по мере их загрузки в загрузчик классов, поэтому он может записывать все, что делает ваш код. Он может делать очень крутые вещи, например, отвечать «когда, где и почему этому полю было присвоено его текущее значение?». Пользовательский интерфейс довольно неуклюжий, и ему может быть трудно обрабатывать большие базы кода, но в некоторых случаях это действительно может сэкономить много времени.

Обновление : Chronon предоставляет коммерческий продукт, который он описывает как «DVR для Java», который, похоже, выполняет те же функции, что и ODB.

Мэтт МакГенри
источник
@Matt McHenry: Я пытался использовать ODB1.5; с автономной программой Java, но я не уверен, как заставить ее работать? Есть ли у вас какие-либо ресурсы, кроме сайта ODB, с объяснением шагов, чтобы заставить его работать автономно и с Eclipse?
Ayusman
@Ayusman: нет, извини, мне не о чем рассказать, кроме того, что есть на сайте ODB. Я не удивлюсь, если он, помимо прочего, не будет работать с новыми форматами файлов .class. :(
Мэтт МакГенри
Интересный ответ!
KrishPrabakar
Похоже, что сайт Omnscient Debugger был заквотирован.
Торбьёрн Равн Андерсен
45

Помимо того, что было упомянуто в более ранних ответах, например, функция перехода Eclipse в кадр в представлении отладки , которая перезапускает отладку раньше в кадре стека (но не возвращает глобальные / статические данные) и отладчик Omniscient , который немного сырой и не так много развивающиеся - есть несколько инструментов на основе Eclipse, которые можно использовать для «возврата» во время (выполнения):

JIVE расширяет отладчик Eclipse Java возможностью записи состояний программы. Перспектива JIVE предоставляет некоторые полезные диаграммы UML, которые обновляются во время работы программы. Эти диаграммы предоставляют обзор состояния приложения (диаграмма объектов) и трассировки стека (диаграмма последовательности). Вы можете запросить запомненную трассу и сделать шаг назад и вперед во времени и увидеть соответствующие диаграммы.

Diver записывает только вызовы методов и на самом деле не записывает состояния программы, такие как JIVE. Каждое событие вызова метода сохраняется для последующего извлечения и анализа. Он расширяет конфигурации Java Run и Debug в основном для определения фильтров. Трассировку можно приостановить / возобновить / отфильтровать во время выполнения. После записи перспектива Diver может отображаться на интерактивной диаграмме последовательности.

JIVE и Diver - это проекты с открытым исходным кодом, созданные в результате академических исследований. По состоянию на ноябрь 2012 года оба проекта активны.

Chronon - коммерческий продукт, но у них есть бесплатные лицензии для студентов и проектов с открытым исходным кодом. Судя по тому, что заявлено на их веб-сайте, это, вероятно, самый полный регистратор, поскольку он может воспроизводить записанную историю, шагать вперед и назад, позволяя, как говорится, отладку во времени. Также Eclipse не нужен для записи.

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

В моем случае я пытался использовать JIVE и Diver для отладки программы синтаксического анализа XML, но всегда останавливал eclipse из-за нехватки ресурсов. Diver может быть сложно запустить на 64-битной Linux , он работает на 32-битной Ubuntu и, возможно, в других 32- битных дистрибутивах, используя эти советы . Diver работает в Windows, а еще лучше - на 64-битной + 64-битной JVM Windows, в противном случае вы будете ограничены максимальным пространством кучи 1,3–1,6 ГБ в 32-битных окнах . JIVE отлично работает на моем 64-битном Linux и, кажется, отлично работает на других платформах.

fmjrey
источник
Дайвер больше не выпускается
merours
12

Да , Eclipse CDT поддерживает функцию исторического отладчика.

Откройте конфигурацию отладки -> Отладчик -> Включить обратную отладку при запуске .

Затем вы можете нажать shift+F5или shift+F6для шага назад, как F5или F6для шага вперед.

Сергей
источник
1
Эта опция существует во всех версиях Eclipse? Будь я проклят, если найду его где-нибудь.
EngineerBetter_DJ
1
Его функция GDB sourceware.org/gdb/wiki/ReverseDebug, которая поддерживается в Eclipse этим запросом bugs.eclipse.org/bugs/show_bug.cgi?id=258284 . Я полагаю, что с 2009 года ответ будет положительным.
Сергей
Он доступен в CDT.
Сергей
Я разработчик Java, так что полагаю, CDT мне не пригодится?
EngineerBetter_DJ
@Sergei Я делаю это под WIndows 7 SP1 со старой версией Springsource. Чтобы включить обратную отладку, вы должны сначала отладить как-> Debug Configurations-> Main. Внизу страницы находится панель запуска процессов. Будет написано «Использование стандартного средства запуска процесса создания» и будет гиперссылка на «Выбрать другое ...». Щелкните здесь и убедитесь, что установлен флажок «Использовать параметры конфигурации», затем выберите «GDB (GSF) Create Process Launcher» и нажмите кнопку «ОК». «Использование GDB (GSF) Create Process Launcher» теперь будет отображаться внизу главной вкладки.
Сэмми
5

Я предвзят, но Chronon делает именно то, что вы ищете.

Drop to Frame - это не совсем шаг назад, поскольку, если метод что-то изменил в куче, он не будет отменен.

pdeva
источник
1
Позволяет ли Chronon делать это в реальном времени? Насколько я понимаю, вам сначала нужно записать сеанс с помощью chronon, а затем вы можете вернуться в этот сеанс. Разве это не так хорошо, как перезапуск приложения? Или, может быть, я что-то
упускаю
2
да, вам нужно сначала записать свое приложение, а затем отладить его в любое время после записи. Это отличается от перезапуска приложения, поскольку вам не нужно выполнять все шаги для воспроизведения ошибки. Все, что вам нужно сделать, это записать ошибку один раз, а затем вы сможете просмотреть ее в любое время, когда захотите отладить, используя только запись. Вам не нужна какая-либо часть исходного окружения для воспроизведения записи.
pdeva
Работает ли Chronon в среде докеров? Моего затмения нет на местном ...
Choi
3

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

Бруно В.А. Пиньейру
источник
1

В вопросе не указывается язык Eclipse, и многие ответы предполагают Java.

При использовании C ++ и GCC с отладчиком GDB у Eclipse есть тот, Run->Move to Lineкоторый выполняет эту работу, и функции, подобные оператору Set Next в Visual Studio . В этом случае Eclipse использует возможность, которая есть в GDB.

Если вы используете Java, я не знаю, как это сделать с помощью Eclipse или Netbeans, хотя в других ответах предлагались плагины. В Eclipse есть команда "drop to frame", которая работает для Java в моей версии (Juno SR1). Если я изменяю и сохраняю код внутри функции в режиме отладки, строка выполнения автоматически перемещается в начало текущей функции, и я могу продолжить оттуда. Не то же самое, что указание строки, но это что-то.

GravityWell
источник