¿Cómo abordar la depuración de una gran base de código no tan familiar?

¿Cómo abordar la depuración de una gran base de código no tan familiar?

Si es posible, avance desde main() hasta el área problemática y siga la ruta de ejecución. En el camino obtendrá una buena idea de cómo las diferentes partes interactúan juntas.

También podría ser útil usar una herramienta de análisis de código estático, como CppDepends o incluso Doxygen, para descubrir las relaciones entre los módulos y poder verlos gráficamente.


Use lápiz y papel, o imágenes/gráficos/tablas en general, para averiguar qué partes pertenecen a dónde y dibuje algunas flechas, etc.

Esto te ayuda a construir y ver la imagen que luego se refinará en tu mente a medida que te sientas más cómodo con ella.

Utilicé un enfoque similar para atacar un sistema infernal que tenía 10 singletons, todos incluidos entre sí. Tuve que volver a dibujarlo varias veces para que encajara todo, pero verlo frente a ti ayuda.

También podría ser útil usar Graphviz al construir gráficos de dependencia. De esa manera, solo tiene que enumerar todo (en un archivo de texto) y luego la herramienta dibujará la imagen (a menudo antiestética). (Esto es lo que hice para las dependencias #include en el sistema anterior)


Como otros ya han sugerido, escribir pruebas unitarias es una excelente manera de ingresar a la base de código. Hay una serie de ventajas en este enfoque:

  1. Le permite probar sus suposiciones acerca de cómo funciona el código. Agregar una prueba de aprobación demuestra que sus suposiciones sobre ese pequeño fragmento de código que está probando son correctas. Cuantas más pruebas apruebe escriba, mejor comprenderá el código.

  2. Una prueba unitaria fallida que reproduzca el error que desea corregir pasará cuando corrija el error y sepa que lo ha logrado.

  3. Las pruebas unitarias que escriba actúan como documentación para el futuro.

  4. Las pruebas unitarias que escribe actúan como pruebas de regresión a medida que se corrigen más errores.

Por supuesto, agregar pruebas unitarias al código heredado no siempre es una tarea fácil. Felizmente, un caballero con el nombre de Michael Feathers ha escrito un excelente libro sobre el tema, que incluye algunas excelentes "recetas" sobre cómo agregar pruebas a bases de código sin pruebas unitarias.