tutorial programa para not instalar dev depurar connected configurar compilador como c++ stl boost gdb

programa - Mejores prácticas de depuración para C++ STL/Boost con gdb



cygwin netbeans (3)

Depurando con gdb, cualquier código de c ++ que use STL / boost sigue siendo una pesadilla. Cualquiera que haya usado gdb con STL lo sabe. Por ejemplo, vea ejemplos de ejecuciones de algunas sesiones de depuración en el código here .

Intento reducir el dolor coleccionando consejos. ¿Puede comentar los consejos que he recopilado a continuación (especialmente los que ha estado usando y los cambios que recomendaría)? He enumerado los consejos que están disminuyendo en orden de tecnicidad.

  • ¿Alguien está usando "Stanford GDB STL utils" y "UCF GDB utils" ? ¿Hay alguna utilidad similar para mejorar las estructuras de datos? Las utilidades anteriores no parecen ser utilizables recursivamente, por ejemplo, para imprimir vector de un boost :: shared_ptr de una manera legible dentro de un comando.
  • Escribe tu archivo .gdbinit. Incluya, por ejemplo, los embellecedores relacionados con C ++, enumerados en la parte inferior de las utilidades UCF GDB.
  • Utilice la biblioteca STL / Boost marcada / depurada, como STLport.
  • Utilice el registro (por ejemplo, como se describe here )

Actualización : GDB tiene una nueva rama de C ++ .


Creo que la opción más fácil y la más sencilla es usar el registro (bueno, de hecho utilizo las impresiones de depuración, pero creo que no es un punto). La mayor ventaja es que puede inspeccionar cualquier tipo de datos, muchas veces por ejecución del programa y luego buscarlo con un editor de texto para buscar datos interesantes. Tenga en cuenta que esto es muy rápido. La desventaja es obvia, debe preseleccionar los datos que desea registrar y los lugares donde iniciar sesión. Sin embargo, ese no es un problema tan grave, ya que normalmente sabes en qué parte del código están pasando cosas malas (y si no, simplemente agregas cheques de cordura aquí y allá y entonces, lo sabrás).

Las bibliotecas comprobadas / depuradas son buenas, pero son mejores como una herramienta de prueba (por ejemplo, ejecutarlo y ver si estoy haciendo algo mal), y no tan bien en la depuración de un problema específico. No pueden detectar un error en el código de usuario.

De lo contrario, uso GDB simple. No es tan malo como suena, aunque podría ser si tienes miedo de " print x " imprimir una pantalla llena de basura. Pero, si tiene información de depuración, cosas como imprimir un miembro de un std::vector funcionan y si algo falla, aún puede inspeccionar la memoria sin procesar con el comando x . Pero si sé lo que estoy buscando, utilizo la opción 1 - registro.

Tenga en cuenta que las estructuras "difíciles de inspeccionar" no solo son STL / Boost, sino también de otras bibliotecas, como Qt / KDE.


Tal vez no es el tipo de "consejo" que estabas buscando, pero debo decir que mi experiencia después de algunos años de pasar de C ++ y STL a C ++ & boost & STL es que ahora paso mucho menos tiempo en GDB que Acostumbrado a. Lo atribuí a varias cosas:

  • aumenta los punteros inteligentes (particularmente el "puntero compartido" y los contenedores de puntero cuando se necesita rendimiento). No puedo recordar la última vez que tuve que escribir una eliminación explícita (borrar es el "goto" de C ++ en mi humilde opinión). Hay un montón de tiempo GDB rastreando punteros no válidos y con fugas.
  • boost está lleno de código probado para cosas que probablemente hackear juntos una versión inferior de lo contrario. por ejemplo, boost::bimap es ideal para el patrón común de lógica de caché de LRU. Ahí va otro montón de tiempo de GDB.
  • Adoptando pruebas unitarias boost::test macros AUTO de boost::test significan que es absolutamente imposible instalar casos de prueba ( más fácil que CppUnit ). Esto atrapa muchas cosas mucho antes de que se incorpore a cualquier cosa que tenga que adjuntar un depurador.
  • En relación con eso, herramientas como boost::bind facilitan el diseño para prueba. por ejemplo, los algoritmos pueden ser más genéricos y menos vinculados con los tipos en los que operan; esto hace que conectarlos en calzas de prueba / proxies / objetos simulados, etc. sea más fácil (eso y el hecho de que la exposición a la tersidad de la plantilla de boost lo alentará a "atreverse a moldear" cosas que nunca habría considerado antes, produciendo beneficios de prueba similares).
  • boost::array . Rendimiento "C array", con comprobación de rango en compilaciones de depuración.
  • boost está lleno de un gran código que no puedes dejar de aprender de