¿Cómo retroceder en el depurador de Eclipse?

129

¿Es posible hacer una ejecución inversa en el depurador Eclipse? El proyecto actual en el que estoy trabajando requiere un mínimo de 5 segundos para leer e inicializar los datos de un archivo antes de que se pueda hacer algo. Si sobrepaso el depurador, tengo que terminar el programa y reiniciarlo, y esto lleva bastante tiempo.

Jason
fuente

Respuestas:

136

Puede usar el comando soltar al marco de Eclipse para volver a ingresar el método actual desde la parte superior. Pero no desenrollará ningún cambio de estado que haya sucedido, por lo que puede no funcionar dependiendo del tipo de método en el que se encuentre.

Otra herramienta realmente genial que realmente te permite retroceder y avanzar en el tiempo es el depurador omnisciente . Funciona instrumentando las clases a medida que se cargan en el cargador de clases, por lo que puede grabar todo lo que hace su código. Puede hacer cosas muy interesantes, como responder "cuándo, dónde y por qué se asignó su valor actual a este campo". La interfaz de usuario es bastante torpe, y puede tener dificultades para manejar bases de código grandes, pero en algunos casos realmente puede ahorrar mucho tiempo.

Actualización : Chronon proporciona un producto comercial que describe como un "DVR para Java", que parece hacer muchas de las mismas cosas que el ODB.

Matt McHenry
fuente
@ Matt McHenry Estaba tratando de usar ODB1.5; con un programa independiente de Java pero no estoy seguro de cómo hacerlo funcionar? ¿Tiene algún recurso que no sea el sitio ODB que explique los pasos para que funcione de manera independiente y con Eclipse?
Ayusman
@Ayusman: no, lo siento, no tengo nada que compartir más allá de lo que hay en el sitio de ODB. No me sorprendería si no funciona con los formatos de archivo .class más nuevos, entre otras cosas. :(
Matt McHenry
Interesante respuesta!
KrishPrabakar
Parece que el sitio web Omnscient Debugger ha sido dominado.
Thorbjørn Ravn Andersen
45

Más allá de lo que se mencionó en las respuestas anteriores, es decir, la función de caída a cuadro de Eclipse en la vista de depuración , que reinicia la depuración antes en el marco de la pila (pero no revierte los datos globales / estáticos) y el depurador omnisciente , que es un poco en bruto y no tanto evolucionando: hay algunas herramientas basadas en Eclipse que podrían usarse para "retroceder" en el tiempo (de ejecución):

JIVE extiende el depurador Eclipse Java con la capacidad de registrar los estados del programa. La perspectiva JIVE proporciona algunos diagramas UML útiles que se actualizan mientras se ejecuta el programa. Estos diagramas proporcionan una visión general del estado de la aplicación (diagrama de objetos) y del seguimiento de la pila (diagrama de secuencia). Puede consultar la traza memorizada y retroceder y avanzar en el tiempo y ver los diagramas correspondientes.

Diver solo graba llamadas a métodos y realmente no graba estados de programa como JIVE. Cada evento de llamada al método se almacena para su posterior recuperación y análisis. Extiende las configuraciones Java Run y ​​Debug principalmente para especificar filtros. El seguimiento se puede pausar / reanudar / filtrar en tiempo de ejecución. Una vez grabada, la perspectiva Diver puede mostrarla en un diagrama de secuencia interactivo.

JIVE y Diver son proyectos de código abierto emitidos por investigaciones académicas. A noviembre de 2012, ambos proyectos están activos.

Chronon es un producto comercial, pero tienen licencias gratuitas para estudiantes y proyectos de código abierto. Por lo que se afirma en su sitio web, es probablemente la grabadora más completa, ya que puede reproducir el historial grabado, avanzar y retroceder, lo que permite, como dicen, la depuración de viajes en el tiempo. Tampoco se necesita Eclipse para grabar.

Todos estos complementos son bastante codiciosos en recursos, por lo que es mejor tener una buena máquina de especificaciones y usar su función de filtro. Un requisito definitivo para ejecutarlos con éxito es extender el espacio de almacenamiento dinámico en eclipse.ini .

En mi caso, intenté usar JIVE y Diver para depurar un programa de análisis XML pero siempre terminé congelando el eclipse debido a la falta de recursos. Diver podría ser difícil de ejecutar en Linux 64 bits , funciona en ubuntu 32 bits y posiblemente en otras distribuciones de 32 bits con estos consejos . Diver funciona en Windows, mejor aún en una JVM de Windows de 64 bits + 64 bits; de lo contrario, estará limitado a un espacio de almacenamiento dinámico máximo de 1.3-1.6 Gb en ventanas de 32 bits . JIVE funciona muy bien en mi Linux de 64 bits, y parece funcionar bien en otras plataformas.

fmjrey
fuente
Diver ha sido descontinuado
merours
12

, Eclipse CDT admite la función de depurador histórico.

Abra la Configuración de depuración -> Depurador -> Habilitar la depuración inversa al inicio .

Entonces puede presionar shift+F5o shift+F6para retroceder como F5o F6para avanzar.

Sergei
fuente
1
¿Existe esta opción en todas las versiones de Eclipse? Me molesta si puedo encontrarlo en cualquier lugar.
EngineerBetter_DJ
1
Su función GDB sourceware.org/gdb/wiki/ReverseDebug que es compatible con Eclipse por esta solicitud de bugs.eclipse.org/bugs/show_bug.cgi?id=258284 . Bueno, supongo que la respuesta es sí desde 2009.
Sergei
Es accesible en CDT.
Sergei
Soy un desarrollador de Java, así que supongo que CDT no me será de mucha utilidad.
EngineerBetter_DJ
@Sergei Estoy haciendo esto en Windows 7 SP1 con una versión antigua de Springsource. Para habilitar la depuración inversa, primero debe depurar como-> Configuraciones de depuración-> Principal. En la parte inferior de la página se encuentra el iniciador de procesos. Dirá "Uso del Lanzador de procesos de creación estándar" y habrá un hipervínculo a "Seleccionar otro ...". Haga clic en esto y asegúrese de que "Usar configuración específica de configuración" esté marcado, luego seleccione "GDB (GSF) Crear proceso Launcher" y haga clic en Aceptar "Usando GDB (GSF) Create Process Launcher" ahora se mostrará en la parte inferior de la pestaña principal.
Sammy
5

Soy parcial, pero Chronon hace exactamente lo que estás buscando.

Drop to Frame no es exactamente un paso atrás, ya que si el método ha cambiado algo en el montón, no se revertirá.

Pdeva
fuente
1
¿Chronon te permite hacer eso en tiempo real? Según tengo entendido, primero debe grabar una sesión con cronon y luego puede retroceder en esa sesión. ¿No es eso tan bueno como reiniciar la aplicación? O tal vez me estoy perdiendo algo ..
Raam
2
Sí, primero debe grabar su aplicación y luego puede depurarla en cualquier momento después de la grabación. Es diferente de reiniciar la aplicación ya que no necesita seguir todos los pasos para reproducir el error. Todo lo que debe hacer es grabar el error una vez y luego puede verlo en cualquier momento que desee depurar utilizando solo la grabación. No necesita ninguna parte del entorno original para reproducir la grabación.
pdeva
¿Chronon funciona en el entorno de Docker? Mi eclise no está en el local ..
Choi
3

Estaba buscando esta característica en eclipse también. Sé que el estudio visual puede hacer eso. En realidad, puede arrastrar el marcador de línea actual y soltarlo en cualquier parte del código. No estoy seguro de si los cambios en las variables se pueden deshacer. Pero aún así es muy útil y ahorra mucho tiempo. He estado esperando esto en eclipse durante mucho tiempo.

Bruno VA Pinheiro
fuente
1

La pregunta no especifica un lenguaje Eclipse, y muchas de las respuestas suponen Java.

Si usa C ++ y GCC con el depurador de GDB, Eclipse tiene el Run->Move to Lineque hace el trabajo y funciona como la siguiente instrucción de Visual Studio Set Next . En este caso, Eclipse está utilizando la capacidad que está en GDB.

Si utilizo Java, no conozco una forma de hacerlo con Eclipse o Netbeans, aunque otras respuestas han sugerido complementos. Eclipse tiene el comando "soltar al marco" que funciona para Java en mi versión (Juno SR1). Si modifico y guardo código dentro de una función en modo de depuración, la línea de ejecución se mueve automáticamente a la parte superior de la función actual y puedo continuar desde allí. No es lo mismo que especificar la línea, pero es algo.

GravityWell
fuente