¿Cuánto tiempo de desarrollador se ahorra debido a las buenas herramientas de depuración?

Se ahorra mucho y mucho tiempo, y muchos proyectos simplemente no se enviarían si no tuviéramos buenas herramientas de depuración, ya que es simplemente imposible desarrollar, probar y enviar un programa muy grande y complejo sin muchos errores encontradas y reparadas en el camino, y encontrarlas sin herramientas de depuración lleva mucho tiempo si se pueden encontrar.

Los depuradores se pueden usar para la depuración “correcta” (como gdb), la depuración de memoria como valgrind o purify y la depuración de subprocesos.

Recuerdo la primera vez que vi un depurador de memoria. Estuve en Postgres en UCB en 1990 y mi jefe me pidió que evaluara una versión alfa de Rational Purify (que originalmente fue escrita por Pure Software). Lo conecté a la compilación de Postgres, realicé una prueba y detecté alrededor de una docena de fugas de memoria y errores de tipo de corrupción de memoria, todos los cuales fueron el tipo de errores que rutinariamente llevaban días o semanas encontrar sin dicha herramienta. .

Me “vendieron” al instante. Hasta que salió Valgrind, siempre aconsejé a las personas que compraran Purify (a pesar de que costaba $ miles), y lo usamos para probar Postgres y otros administradores de datos con los que ayudé a lo largo de los años.

Sí, puedes imaginarte haciendo cosas como enfoques cuidadosos de programación de pruebas de teoremas, y muchas revisiones de código y cosas para tratar de que el código sea “correcto”, pero estos son caros y, aunque pueden usarse en “proyectos reales”, Por lo general, se usan solo con el código central “importante”. Incluso allí, la implementación real del código generalmente implica un montón de ciclos de prueba y depuración, generalmente con herramientas de depuración.

Existe una extraña fascinación con la idea de no usar depuradores entre una determinada cohorte de programadores (generalmente muy jóvenes). Nunca he entendido esto: si una herramienta lo ayuda a mejorar su código rápidamente, úselo.

Grandes cantidades, especialmente si incluye herramientas de análisis estático y monitoreo de memoria / concurrencia.

“Bueno” es, sin embargo, una clasificación situacional aquí. Principalmente trabajo en C ++, donde hay muchas herramientas útiles, pero a veces a medias, y diferencias en cada plataforma. Creo que lldb es mucho más racional que gdb, pero parte de la sintaxis es terriblemente detallada. Visual Studio hace que sea fácil verlo todo, pero WinDBG es posiblemente una representación más precisa de la realidad, excepto que a veces falla con el seguimiento de variables de la pila, lo cual es imperdonable. En Linux, deshacer db, aunque no es barato, es un cambiador de juego potencial. Valgrind, vld … No puedo pensar en nada que no tenga peculiaridades, pero colectivamente, me han salvado cientos de horas en el transcurso de mi carrera. Vale la pena invertir en cualquier cosa que me ahorre horas de reproducción y paso a través del código para encontrar un error.

No tengo una respuesta cuantitativa, pero la respuesta cualitativa es “mucho”. He estado usando C # y Visual Studio 2010 (planeamos actualizar a VS 2015 cuando salga), y hay algunas cosas que realmente me gusta poder hacer y algunas cosas que desearía poder hacer.

Algunas de las cosas que puede hacer que son útiles (generalmente no son cosas innovadoras, pero la mayoría de los depuradores deberían poder hacer esto o algo similar):

  • Romper cuando se golpean excepciones (ya sea de un tipo en particular) (ya sea por primera oportunidad o sin control)
  • Puntos de interrupción
  • Escriba la salida cuando se golpea un lugar particular en el código, que puede incluir valores variables (“puntos de rastreo”)
  • Haga que los puntos de interrupción o los puntos de rastreo sean condicionales para que solo se activen si se cumple una condición particular o si la golpea un número particular de veces
  • Evaluar expresiones, variables, etc. en el depurador (pero no lambdas)
  • Entra en funciones
  • Establezca el punto de ejecución en el código (pero realmente no retroceda)
  • Cambiar valores variables
  • Muévase en la pila y cambie entre diferentes procesos y subprocesos

Ojalá pudiera:

  • Da un paso atrás en el código. Esta es la única característica en VS Ultimate Edition que desearía tener. Parece que cuando sería útil, sería muy útil y evitaría tener que ejecutar el mismo escenario n veces para depurar el problema.
  • Evaluar lambdas en la ventana de observación (será en VS 2015)
  • Tener más control sobre las excepciones que rompo. (Por ejemplo, hay excepciones de primera oportunidad a lo largo de rutas particulares en las que nunca quiero romper, pero no puedo optar por excluirlas sin excluir todas las excepciones de ese tipo).
  • Examine los valores intermedios y de retorno más fácilmente

He tenido casos con amigos que luchan con un error durante una semana, que luego soluciono en dos minutos, no porque entienda mejor su programa, sino porque sé cómo usar las herramientas de depuración. Su respuesta fue “esto es trampa” 😀

Acerca de mis propios errores, algunos de ellos no creo que hubiera podido resolver sin mis herramientas. Para la “depuración de impresión”, debe tener al menos una idea de lo que podría estar mal. Sin mencionar que la E / S cambia el comportamiento del programa, por lo que el error podría no estar presente cuando agrega las declaraciones de impresión (los programas multiproceso son malvados así).

El tiempo dedicado a registrar todo, en todas partes, para encontrar la causa exacta de un problema.