2010-11-29 16 views
19

Sé que E & C es un tema controvertido y algunos dicen que fomenta un enfoque incorrecto para la depuración, pero aún así, creo que podemos estar de acuerdo en que hay numerosos casos cuando es claramente útil, experimentando con diferentes valores de algunas constantes, rediseñando los parámetros de la GUI sobre la marcha para encontrar un buen aspecto ... Lo que sea.Editar y continuar en GDB

Mi pregunta es: ¿Alguna vez tendremos E & C en GDB? Entiendo que es una característica específica de la plataforma y necesita una cooperación seria con el compilador, el depurador y el OS (MSVC tiene esto fácil, ya que el compilador y el depurador siempre vienen en un solo paquete), pero ... todavía debería ser factible. Incluso he escuchado algo sobre Apple teniendo implementado en su versión de GCC [citación necesitada]. Y yo diría que de hecho es factible.

Sabiendo todo el bombo sobre MSVC E & C (mi experiencia dice que es el primero que los usuarios de MSVC mencionan cuando se le preguntó "¿por qué no cambiar a Eclipse y gcc/gdb"), estoy seriamente sorprendió que después de algún años GCC/GDB todavía no tiene esa característica. ¿Hay alguna buena razón para eso? ¿Alguien está trabajando en eso mientras hablamos?

+0

Una respuesta real no es posible aquí, sería masiva llama y cebo downvote. Pruebe programmers.se y pregunte acerca de los roles de liderazgo en el mundo foss. –

+1

Hans, sinceramente no entiendo su comentario. Creo que mi pregunta está bastante bien formada: es una pregunta específica sobre una popular cadena de herramientas y una conocida función de depurador; Me gustaría saber si existen obstáculos técnicos importantes que impidan a las personas implementar E & C en gcc/gdb y si ya se ha conocido algún trabajo para implementarlo. – Kos

+0

Heh. Nunca uso E & C, pero igual encuentro Visual Studio mucho mejor que Eclipse o cualquier otro combo basado en GCC/GDB. Esto se debe totalmente a la estrecha integración entre el editor y el depurador, y prefiero la forma en que la interfaz es bastante liviana (a menos que elijas usar las funciones más pesadas). Ningún otro IDE es tan fácilmente utilizable o limpio interconectado en mi opinión. Como tal, uso VStudio para desarrollar WITH GCC y varias otras plataformas. – Goz

Respuesta

15

Es una cantidad sorprendentemente no trivial de trabajo, que abarca muchas decisiones de diseño y las compensaciones de características. Considera: estás depurando. El debugee está suspendido. Su imagen en la memoria contiene el código objeto de la fuente y el diseño binario de los objetos, el montón, las pilas. El depurador está inspeccionando su imagen de memoria. Ha cargado información de depuración sobre los símbolos, tipos, asignaciones de direcciones, pc (ip) a las correspondencias de origen.Muestra la pila de llamadas, valores de datos.

Ahora desea permitir un conjunto particular de posibles modificaciones al código y/o datos, sin detener el depuración y reiniciar. Lo más simple podría ser cambiar una línea de código a otra. Quizás recompilas ese archivo o solo esa función o solo esa línea. Ahora debe parchear la imagen de depuración para ejecutar esa nueva línea de código la próxima vez que la recorra o la ejecute. ¿Cómo funciona eso bajo el capó? ¿Qué sucede si el código es más grande que la línea de código que reemplazó? ¿Cómo interactúa con las optimizaciones del compilador? Quizás solo pueda hacer esto en un objetivo de depuración EnC especialmente compilado. Quizás restrinja sitios posibles, es legal para EnC. Considere: qué sucede si edita una línea de código en una función suspendida en la pila de llamadas. Cuando el código retorna, ¿ejecuta la versión original de la función o la versión con la línea modificada? Si es la versión original, ¿de dónde viene esa fuente?

¿Puede agregar o eliminar locales? ¿Qué hace eso con la pila de llamadas de marcos suspendidos? De la función actual?

¿Se puede cambiar la firma de la función? Agregar campos a/eliminar campos de los objetos? ¿Qué hay de las instancias existentes? ¿Qué hay de los destructores o finalizadores pendientes? Etc.

Hay muchos, muchos detalles de funcionalidad que se deben tener en cuenta para hacer que cualquier clase de EnC funcione. Luego hay muchos problemas de integración entre herramientas necesarios para proporcionar la infraestructura para alimentar EnC. En particular, ayuda tener algún tipo de repositorio de información de depuración que pueda poner a disposición la información de depuración antes y después de la edición y el código de objeto para el depurador. Para C++, la información de depuración incrementalmente actualizable en PDB ayuda. La vinculación incremental también puede ser útil.

Mirando desde el ecosistema MS hasta el ecosistema GCC, es fácil imaginar la complejidad y los problemas de integración en GDB/GCC/binutils, la gran cantidad de objetivos, algunas abstracciones de objetivos específicas específicas de EnC, y el "bueno tener" pero la "naturaleza no esencial" de EnC es la razón por la cual no ha aparecido aún en GDB/GCC.

Happy hacking!

(ps Es instructivo e inspirador ver lo que podría hacer el entorno de programación interactiva Smalltalk-80. En St80 no había concepto de "reinicio": la imagen y su memoria de objetos siempre estaban en vivo, si editaba cualquier aspecto de una clase que todavía tenía que seguir ejecutando. En tales entornos, el control de versiones de los objetos no era hipotético.)

11

No estoy familiarizado con E de MSVC & C, pero BGF tiene algunas de las cosas que has mencionado:

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

17. Ejecución Alterar

Una vez que cree que ha encontrado un error en su programa, es posible que desee averiguar con certeza si la corrección del error aparente daría lugar a resultados correctos en el resto de la ejecución. Puede encontrar la respuesta por experimento, utilizando las funciones de gdb para alterar la ejecución del programa.

Por ejemplo, puede almacenar valores nuevos en variables o ubicaciones de memoria, darle una señal a su programa, reiniciarlo en una dirección diferente, o incluso regresar prematuramente de una función.

Asignación: Asignación a las variables
Salto: Continuando en una dirección diferente
señalización: Dar a su programa una señal
Volviendo: Al regresar de una función
Calling: Llamada las funciones de su programa
Parcheo: Parchear el programa
Compilación y Código Inyectar: Compilar e inyectar código en el BGF

+0

Si entiendo correctamente, lo que E & C sería es una integración conveniente de gcc/g ++ y el " parcheo "característica de gdb. Me sorprende que E & C no sea común en gcc/gdb toolchain si gdb ya es compatible con una función como el parcheo. – Kos

+0

En el lenguaje GDB, "parchear" es bastante limitado. Básicamente permite reescribir partes del núcleo ejecutable mientras se ejecuta, sin proporcionar ninguna de las seguridades necesarias para una recompilación verdadera que Jan Gray señaló en su excelente respuesta. – Mark

3

Esta es una referencia bastante buena de la antigua implementación de Apple de "corregir y continuar". También hace referencia a otras implementaciones que funcionan.

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

Aquí hay un fragmento:

Fix y continuar es una característica implementada por muchos otros depuradores, la que hemos añadido a nuestra GDB para esta versión. Sun Workshop, SGI ProDev WorkShop, Microsoft Visual Studio, HP's wdb y Sun's Hotspot Java VM proporcionan esta característica de una forma u otra. Basé nuestra implementación en la función HP wdb Fix and Continue, que agregaron hace unos años . Aunque mi implementación final sigue los esquemas generales del enfoque que tomaron, casi no hay código compartido entre ellos. Parte de esto se debe a las diferencias arquitectónicas (tanto el procesador como el ABI), pero aún más es debido a diferencias en el diseño de implementación.

Tenga en cuenta que esta capacidad puede haberse eliminado en una versión posterior de su cadena de herramientas.

ACTUALIZACIÓN: dic-21-2012 Hay una presentación en PDF GDB Roadmap que incluye una diapositiva que describe "Reparar y continuar", entre otros puntos. La presentación tiene fecha del 9 de julio de 2012, por lo que tal vez haya alguna esperanza de que se haya agregado esto en algún momento. La presentación fue parte del GNU Tools Cauldron 2012.

Cuestiones relacionadas