He sido desarrollador de software durante más de veinte años, programando en C, Perl, SQL, Java, PHP, JavaScript y recientemente Python. Nunca he tenido un problema que no podía depurar usando un pensamiento cuidadoso y print
declaraciones de depuración bien ubicadas .
Respeto que muchas personas dicen que mis técnicas son primitivas, y usar un depurador real en un IDE es mucho mejor. Sin embargo, desde mi observación, los usuarios de IDE no parecen depurar más rápido o con más éxito que yo, usando mis cuchillos de piedra y pieles de oso. Estoy sinceramente abierto a aprender las herramientas adecuadas, nunca se me ha mostrado una ventaja convincente al usar depuradores visuales.
Además, nunca he leído un tutorial o libro que muestre cómo depurar eficazmente utilizando un IDE, más allá de los conceptos básicos de cómo establecer puntos de interrupción y mostrar el contenido de las variables.
¿Qué me estoy perdiendo? ¿Qué hace que las herramientas de depuración IDE sean mucho más efectivas que el uso reflexivo de las print
declaraciones de diagnóstico ?
¿Puede sugerir recursos (tutoriales, libros, screencasts) que muestren las mejores técnicas de depuración IDE?
¡Dulces respuestas! Muchas gracias a todos por tomarse el tiempo. Muy esclarecedor He votado a muchos y no he votado a ninguno.
Algunos puntos notables:
- Los depuradores pueden ayudarme a realizar una inspección o modificación ad hoc de variables, código o cualquier otro aspecto del entorno de tiempo de ejecución, mientras que la depuración manual requiere que detenga, edite y vuelva a ejecutar la aplicación (posiblemente requiera una nueva compilación).
- Los depuradores pueden conectarse a un proceso en ejecución o usar un volcado por caída, mientras que con la depuración manual, son necesarios "pasos para reproducir" un defecto.
- Los depuradores pueden mostrar estructuras de datos complejas, entornos de subprocesos múltiples o pilas de tiempo de ejecución completas fácilmente y de una manera más legible.
- Los depuradores ofrecen muchas formas de reducir el tiempo y el trabajo repetitivo para realizar casi cualquier tarea de depuración.
- Los depuradores visuales y los depuradores de consola son útiles y tienen muchas características en común.
- Un depurador visual integrado en un IDE también le brinda un acceso conveniente a la edición inteligente y a todas las demás funciones del IDE, en un solo entorno de desarrollo integrado (de ahí el nombre).
Respuestas:
Algunos ejemplos de algunas habilidades que un depurador IDE le dará sobre mensajes de rastreo en código:
En resumen, las declaraciones impresas son (generalmente) estáticas y necesitará volver a compilar para obtener información adicional si sus declaraciones originales no fueron lo suficientemente detalladas. El IDE elimina esta barrera estática, ofreciéndole un juego de herramientas dinámico al alcance de su mano.
Cuando comencé a codificar por primera vez, no podía entender cuál era el problema con los depuradores y pensé que podía lograr cualquier cosa con el rastreo (concedido, eso estaba en Unix y el depurador era GDB). Pero una vez que aprenda a usar correctamente un depurador gráfico, no querrá volver a imprimir declaraciones.
fuente
Un depurador IDE le permite cambiar los valores de las variables en tiempo de ejecución.
Un depurador IDE le permite ver el valor de las variables que no sabía que quería ver cuando comenzó la ejecución.
Un depurador IDE le permite ver la pila de llamadas y examinar el estado de la función pasada valores extraños. (piense que esta función se llama desde cientos de lugares, no sabe de dónde provienen estos valores extraños)
Un depurador IDE le permite interrumpir la ejecución condicionalmente en cualquier punto del código, según una condición, no un número de línea.
Un depurador IDE le permitirá examinar el estado del programa en el caso de una excepción no controlada en lugar de limitarse.
fuente
Aquí hay una cosa que definitivamente no puede depurar con la declaración "print", que es cuando un cliente le trae un volcado de memoria y dice "su programa se bloqueó, ¿puede decirme por qué?"
fuente
fuente
Creo que la depuración con declaraciones impresas es un arte perdido y muy importante para que cada desarrollador aprenda. Una vez que sabe cómo hacer eso, ciertas clases de errores se vuelven mucho más fáciles de depurar de esa manera que a través de un IDE. Los programadores que conocen esta técnica también tienen una muy buena idea de lo que es información útil para poner en un mensaje de registro (sin mencionar que en realidad terminarás leyendo el registro) también para fines de no depuración.
Dicho esto, realmente debería saber cómo usar el depurador paso a paso, ya que para una clase diferente de errores es MUCHO más fácil. Lo dejaré a las otras excelentes respuestas ya publicadas para explicar por qué :)
fuente
La parte superior de mi cabeza:
fuente
Como alternativa a la depuración en IDE, puede probar la excelente consola PHP de la extensión Google Chrome con la biblioteca php que permite:
fuente
No he estado desarrollando durante casi 20 años, pero encuentro que usando un IDE / depurador puedo:
fuente
Una razón para usar el IDE podría ser que los IDE modernos admiten más que simples puntos de interrupción. Por ejemplo, Visual Studio ofrece las siguientes funciones avanzadas de depuración:
Además, cuando utilice el depurador, no tendrá que eliminar todas sus declaraciones de impresión una vez que haya finalizado la depuración.
fuente
Una cosa que me sorprende no haber visto en otra respuesta es que los 2 métodos de depuración no son mutuamente excluyentes .
printf
la depuración puede funcionar bastante bien incluso si está utilizando un depurador estándar (ya sea basado en IDE o no). En particular, con un marco de registro para que pueda dejar todo o la mayor parte del producto lanzado para ayudar a diagnosticar los problemas del cliente.Como se señaló en casi todas las otras respuestas aquí, lo mejor de un depurador estándar es que le permite examinar más fácilmente (y potencialmente cambiar) los detalles del estado del programa. No tiene que saber de antemano qué es lo que desea mirar: todo está disponible a su alcance (más o menos).
fuente
En mi experiencia, las impresiones simples tienen una gran ventaja que nadie parece mencionar.
El problema con un depurador IDE es que todo sucede en tiempo real. Detiene el programa en un momento determinado, luego sigue los pasos uno por uno y es imposible regresar si de repente quiere ver lo que sucedió antes. Esto está completamente en desacuerdo con el funcionamiento de nuestro cerebro. El cerebro recopila información y gradualmente forma una opinión. Puede ser necesario repetir los eventos varias veces para hacerlo, pero una vez que haya superado cierto punto, no podrá regresar.
En contraste con esto, una serie seleccionada de impresiones / registro le brinda una "proyección espacial de los eventos temporales". Le da una historia completa de lo que sucedió, y puede retroceder y cuarto varias veces muy fácilmente simplemente desplazándose hacia arriba y hacia abajo. Facilita responder preguntas como "¿ocurrió A antes de que ocurriera B"? Puede hacerte ver patrones que ni siquiera estabas buscando.
Entonces en mi experiencia. IDE y los depuradores son herramientas fantásticas para resolver problemas simples cuando algo en una sola pila de llamadas salió mal, y explorar el estado actual de la máquina en un cierto bloqueo.
Sin embargo, cuando nos acercamos a problemas más difíciles en los que está involucrado un cambio gradual de estado. Donde, por ejemplo, un algoritmo corrompió una estructura de datos, eso a su vez causó que fallara un algoritmo de otro. O si queremos responder preguntas como "con qué frecuencia sucede esto", "las cosas suceden en el orden y en la forma en que imagino que sucedan". etc. Luego, la técnica de registro / impresión "antiguo" tiene una clara ventaja.
Lo mejor es usar cualquiera de las técnicas cuando sea más adecuado, por ejemplo, usar el registro / impresiones para llegar a algunos errores, y hacer una pausa en un punto de interrupción donde necesitamos explorar el estado actual con más detalle.
También hay enfoques híbridos. Por ejemplo, cuando haces console.log (objeto) obtienes un widget de estructura de datos en el registro que puedes expandir y explorar más en detalle. Esto es muchas veces una clara ventaja sobre un registro de texto "muerto".
fuente
Debido a que la depuración de aplicaciones de subprocesos múltiples con declaraciones impresas te volverá loco. Sí, todavía puede hacerlo con declaraciones de impresión, pero necesitaría muchas de ellas y desentrañar la impresión secuencial de las declaraciones para emular la ejecución de subprocesos múltiples llevaría mucho tiempo.
Los cerebros humanos solo tienen un solo hilo desafortunadamente
fuente
Como solicitó sugerencias para libros ... En lo que respecta a la depuración de Windows, John Robbins tiene varias ediciones de un buen libro sobre depuración de Windows:
Depuración de aplicaciones para Microsoft .NET y Microsoft Windows
Tenga en cuenta que la edición más reciente ( Depuración de aplicaciones Microsoft .NET 2.0 ) es solo .NET, por lo que es posible que desee una más antigua (como en el primer enlace) si desea la depuración de código nativo (cubre tanto .NET como nativo).
fuente
Personalmente, creo que la respuesta es tan simple como "Un depurador / IDE integrado le brinda una gran cantidad de información diferente rápidamente sin la necesidad de introducir comandos. La información tiende a estar frente a usted sin que usted no le haya dicho qué hacer". mostrarte.
La facilidad con la que se puede recuperar la información es lo que los hace mejores que solo la depuración de línea de comandos o la depuración "printf".
fuente
Ventajas de un depurador sobre un printf ( tenga en cuenta no un depurador IDE sino cualquier depurador )
Puede establecer puntos de observación. Esta es una de mis formas favoritas de encontrar daños en la memoria.
Puede depurar un binario que no puede volver a compilar en este momento
Puede depurar un binario que lleva mucho tiempo volver a compilar
Puede cambiar variables sobre la marcha
Puede llamar funciones sobre la marcha
No tiene el problema de que las redes de estado de depuración no se vacíen y, por lo tanto, el problema de sincronización no se puede depurar con precisión
Los depuradores ayudan con los volcados del núcleo, las declaraciones de impresión no
fuente
Esto es lo que más uso en las ventanas de depuración de VS.NET:
En resumen, me da una vista de 360 grados del estado de mi código de ejecución, no solo una pequeña ventana.
Nunca encontré un libro que enseñara este tipo de cosas, pero, de nuevo, parece ser bastante simple, es más o menos WYSIWYG.
fuente
Un depurador puede adjuntarse a un proceso en ejecución
A menudo es más fácil depurar el código de un depurador
fuente
Con un depurador IDE puede ver los valores de TODAS las variables en el alcance actual (hasta la pila de llamadas) cada vez que detiene la ejecución.
Las declaraciones impresas pueden ser excelentes, pero arrojar tanta información a la pantalla en cualquier lugar puede producir una gran cantidad de declaraciones impresas.
Además, muchos depuradores IDE le permiten escribir y evaluar métodos, y evaluar miembros mientras está detenido, lo que aumenta aún más la cantidad de declaraciones impresas que tendría que hacer.
Sin embargo, creo que los depuradores son mejores para algunos idiomas que para otros ...
Mi opinión general es que los depuradores IDE son absolutamente, increíblemente maravillosos para lenguajes administrados como Java o C #, son bastante útiles para C ++, y no son muy útiles para lenguajes de script como Python (pero podría ser que simplemente no he probado un buen depurador para cualquier lenguaje de script todavía).
Me encanta el depurador en IntelliJ IDEA cuando desarrollo Java. Solo uso declaraciones de impresión cuando uso Python.
fuente
Como alguien dijo anteriormente: ¡Depurador! = IDE.
gdb y (en el pasado) TurboDebugger (autónomo) funcionan bien para los idiomas que admiten [ed], gracias. (o una tecnología aún más antigua: depurador Clipper vinculado al propio ejecutable xBase) - ninguno de estos requiere un IDE
Además, aunque la codificación C / ++ es más rara, las declaraciones printf a veces ocultan el error que está tratando de encontrar. (problemas de inicialización en vars automáticos en la pila, por ejemplo, o asignación / alineación de memoria)
Finalmente, como otros dijeron, puedes usar ambos. Algunos problemas en tiempo real casi requieren una impresión, o al menos un juicioso "* video_dbg = (is_good? '+': '-');" en algún lugar de la memoria de video. Mi edad se muestra, esto estaba bajo DOS :-)
TMTOWTDI
fuente
Además de mucho de lo que han dicho los otros carteles, realmente me gusta pasar de una línea a la vez junto con la computadora, ya que me obliga a pensar en una línea a la vez. A menudo atraparé el error sin siquiera mirar los valores de las variables simplemente porque me veo obligado a mirarlo cuando hago clic en el botón 'siguiente línea'. Sin embargo, no creo que mi respuesta te ayude, Bill, porque probablemente ya tienes esta habilidad.
En cuanto a los recursos de aprendizaje, no he usado ninguno, simplemente exploro todos los menús y opciones.
fuente
¿Es esta una pregunta real del verdadero programador?
Cualquiera que haya pasado incluso 5 minutos depurando con declaraciones impresas y depurando con IDE, ¡le OCURRIRÁ sin siquiera preguntar!
fuente
He usado impresiones e IDEs para depurar y preferiría depurar usando un IDE. El único momento para mí cuando eso no funciona es en situaciones críticas de tiempo (como depurar juegos en línea) donde se llena el código con declaraciones impresas y luego se miran los archivos de registro después de que se ha salido terriblemente mal. Luego, si aún no puede resolverlo, agregue más impresiones y repita.
fuente
Solo quería mencionar una característica útil de un depurador de consola vs printf y vs depurador en un IDE.
Puede adjuntarlo a una aplicación remota (obviamente, compilada en modo DEPURACIÓN) e inspeccionar su estado volcando la salida del depurador a un archivo utilizando la
tee
utilidad POSIX . En comparación con printf, puede elegir dónde generar el estado en tiempo de ejecución.Me ayudó mucho cuando estaba depurando aplicaciones Adobe Flash implementadas en un entorno agresivo . Solo necesita definir algunas acciones que impriman el estado requerido en cada punto de interrupción, iniciar el depurador de la consola
fdb | tee output.log
y recorrer algunos puntos de interrupción. Después de eso, puede imprimir el registro y analizar la información mediante una comparación exhaustiva del estado en diferentes puntos de interrupción.Desafortunadamente, esta característica [iniciar sesión en un archivo] rara vez está disponible en los depuradores de GUI, lo que hace que los desarrolladores comparen el estado de los objetos en su cabeza.
Por cierto, mi opinión es que uno debe planificar dónde y qué depurar antes de mirar a un depurador.
fuente
Bueno, otra cosa es que si te unes a un nuevo proyecto antiguo y nadie sabe realmente cómo está haciendo el código lo que está haciendo, entonces no puedes depurar haciendo eco de variables / objetos / ... b / c, no tienes idea de qué código es ejecutado en absoluto.
En mi trabajo, me enfrento exactamente a ese tipo de situación y XDebuging visual me ayuda a tener una idea de lo que está sucediendo y dónde, en absoluto.
Atentamente
Raffael
fuente
Además de las muchas cosas que ya se han mencionado, una de las ventajas más importantes de un depurador sobre printf es que el uso de declaraciones printf supone que usted sabe en qué función reside el error. En muchos casos no lo hace, por lo que debe hacer algunas conjeturas y agregar declaraciones de impresión a muchas otras funciones para localizarlo. El error puede estar en el código marco o en algún lugar alejado de donde crees que está. En un depurador es mucho más fácil establecer puntos de interrupción para examinar el estado en diferentes áreas del código y en diferentes momentos.
Además, un depurador decente le permitirá realizar una depuración de estilo printf al adjuntar condiciones y acciones a puntos de interrupción, de modo que aún conserve los beneficios de la depuración printf, pero sin modificar el código.
fuente
La depuración en un IDE es invaluable en un entorno donde los registros de errores y el acceso de shell no están disponibles, como un host compartido. En ese caso, un IDE con un depurador remoto es la única herramienta que le permite hacer cosas simples como ver
stderr
ostdout
.fuente
Un problema con el uso de declaraciones de impresión es que hace un desastre con su código. Es decir, tiene una función con 10 partes y sabe que falla en algún lugar, pero no está seguro de dónde. Entonces agrega 10 declaraciones de impresión adicionales para determinar dónde está el error. Una vez que haya encontrado y resuelto su error, ahora tiene que limpiar quitando todas esas declaraciones impresas. Quizás hagas eso. Tal vez lo olvide y termine en producción y la consola de su usuario esté llena de impresiones de depuración.
fuente
Wauw, ¿me gusta esta pregunta? Nunca me atreví a posarlo ...
Parece que las personas simplemente tienen diferentes formas de trabajar. Para mí lo que funciona mejor es:
Me he ganado la vida programando durante más de 40 años, trabajando en aplicaciones técnicas y científicas no triviales en C ++ y Python diariamente, y tengo la experiencia personal de que un depurador no me ayuda un poco.
No digo que sea bueno. No digo que sea malo. Solo quiero compartirlo.
fuente
No es solo depuración. Un IDE lo ayuda a construir un mejor software más rápido de muchas maneras:
Podría seguir.
fuente