Mejor exploración de variables al depurar código C++ con Eclipse/CDT
gdb eclipse-cdt (6)
Bueno, gdb no admite contenedores STL de forma nativa. No se puede decir que esto sea incorrecto, ya que expondrá el funcionamiento interno de los objetos STL, pero la mayoría de las veces no es lo que queremos, ¿verdad?
Si está utilizando gdb 7.0 puede aprovechar las bonitas impresoras. Este sitio web http://sourceware.org/gdb/wiki/STLSupport tiene un tutorial bastante simple sobre cómo configurarlos. Copié debajo de la parte que te interesa:
Verifique las últimas impresoras libstdc ++ de Python en un lugar de su máquina. En un directorio local, hacer:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
Agregue lo siguiente a su ~ / .gdbinit. La ruta necesita coincidir con el módulo de python que se mostró más arriba. Por lo tanto, si se desprotege a: / home / maude / gdb_printers /, la ruta sería como está escrita en el ejemplo:
python import sys sys.path.insert(0, ''/home/maude/gdb_printers/python'') from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers (None) end
La ruta debe ser el único elemento que debe ajustarse en el ejemplo anterior. Una vez cargadas, las clases de STL que admiten las impresoras deberían imprimirse en un formato más legible para las personas. Para imprimir las clases en el estilo anterior, use el modificador / r (raw) en el comando de impresión (es decir, print / r foo). Esto imprimirá las clases como si las lindas impresoras de Python no estuvieran cargadas.
Como está utilizando eclipse cdt, no olvide indicar su configuración de depuración en su archivo .gdbinit. Al crear una nueva configuración de depuración, vaya a la pestaña Depurador y coloque la ruta al archivo .gdbinit en el campo "Archivo de comando GDB".
¡Espero que eso ayude!
Al usar Eclipse y CDT para depurar el código de C ++, las ventanas de variables son engorrosas y poco informativas para los tipos definidos en la biblioteca de plantillas estándar o en el refuerzo (por ejemplo, shared_ptr).
Solo un ejemplo de cómo puede ser esto para un std :: vector:
bar {...}
std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >
_M_impl {...}
std::allocator<TSample<MyTraits> > {...}
_M_start 0x00007ffff7fb5010
_M_finish 0x00007ffff7fd4410
_M_end_of_storage 0x00007ffff7fd5010
Incluso si esta información sobre los aspectos internos de esos tipos puede ser útil, en casi todos los casos, esperaría una presentación más clara aquí, es decir, una lista de valores para std :: vector. ¿Hay herramientas, complementos u otras modificaciones que pueden hacer esto?
EDITAR
Las siguientes soluciones no funcionan para Linux. Estoy usando ubuntu 14.04, eclipse, g ++, gdb.
No puedo encontrar un paquete gdb-python y linux no usa mingw
En la vista de depuración en la lista de variables, expanda el vector:
"vector_name"
-> std::_Vector_base<"datatype">
-> _M_impl
a continuación, haga clic derecho en _M_start
y seleccione "Mostrar como matriz ...", escriba su longitud y luego haga clic en Aceptar. Ahora puedes expandir cada elemento de tu vector.
Me gustaría ampliar la respuesta de Windows 7 porque algunos pasos clave se omiten:
Esto es para usuarios de MinGW con Eclipse CDT
0) Si no tiene Python GDB, abra un shell / command y use MinGW-get.exe para ''instalar'' GDB habilitado para Python, por ej.
MinGw-get.exe install gdb-python
1a) Obtenga Python 2.7.x de http://python.org/download/ e instálelo
1b) Asegúrese de que PYTHONPATH y PYTHONHOME se encuentren en su entorno:
PYTHONPATH should be C:/Python27/Lib (or similar)
PYTHONHOME should be C:/Python27
1c) Agregue PYTHONHOME a su TRAYECTORIA
%PYTHONHOME%;...
2a) Abra un texto enter, ingrese las siguientes afirmaciones. Observe que la tercera línea señala hacia dónde se ubican los scripts de Python. ¡Vea las notas a continuación sobre esto!
python
import sys
sys.path.insert(0, ''C:/MinGW/share/gcc-4.6.1/python'')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
2b) Guardar como ''.gdbinit'' NOTA: el explorador de Windows no le permitirá nombrar un archivo que comience con un período del explorador. La mayoría de las ediciones de texto (incluido el Bloc de notas) te lo permitirán. Los archivos de inicio de GDB son como ''scripts'' de los comandos de GDB que se ejecutarán en GBD al cargarlos.
2c) El archivo ''.gdbinit'' debe estar en el directorio de trabajo de GDB (lo más probable es que este sea su directorio raíz de proyectos, pero su IDE puede decirle.
3) Abra su diálogo de preferencias Eclipse (u otro IDE). Vaya al submenú C ++ Debugger.
4) Configure Eclipse para usar C:/MinGW/bin/gdb-python27.exe
como el depurador y su .gdbinit
como el archivo de configuración.
5a) Vuelva a crear todas las configuraciones de inicio de depuración (elimine la anterior y cree una nueva desde cero).
--OR--
5b) Edite cada configuración de depuración y apúntela al nuevo gdb-python.exe Y apúntelo a.
Si te encuentras con problemas:
- ¡No olvides cambiar la ubicación al directorio python en el código python anterior! Este directorio ha sido creado por MinGW, así que no busques descargar las bonitas impresoras, MinGW lo hizo por ti en el paso cero. Simplemente vaya a su director de instalación MinGW, la carpeta compartida, la carpeta GCC (tiene número de versión) y encontrará la carpeta python. Esta ubicación es lo que debería estar en el script de python cargado por GDB.
--También, .gdbinit es un PITA, asegúrese de que su nombre sea correcto y en la carpeta de trabajo de GDB, que no es necesariamente donde se encuentra gdb-python.exe. Mire la salida de su GDB cuando cargue GDB para ver si a) aparece ''python-enabled'' durante la carga y aparecen las declaraciones en .gdbinit.
- Finalmente, tuve muchos problemas con las variables del sistema. Si python te da ''ImportError'', entonces lo más probable es que no hayas establecido PYTHONPATH o PYTHONHOME.
--El directorio con ''gdb-python27'' (por ejemplo, C: / MinGW / bin '') también debe estar en su ruta y, si lo está, hace que la configuración de eclipse sea un poco más agradable porque no necesita poner en rutas absolutas . Pero aún así, a veces el .gbdinit necesita un camino de absoulte. si funciona, verá el resultado de gbd (console-> gdb traces) como este al inicio del depurador:
835,059 4^done
835,059 (gdb)
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb)
835,129 13source C:/MinGW/bin/.gdbinit
835,139 &"source C://MinGW//bin//.gdbinit/n"
835,142 13^done
835,142 (gdb)
Necesita una versión de GDB capaz de usar python para imprimir estructuras bonitas. Sé al menos en Windows usando mingw que esto no se proporciona en la instalación predeterminada.
Las Pretty Printers son módulos de Python que le dicen a gdb cómo mostrar una estructura determinada. Puedes escribir el tuyo, pero ya hay impresoras para STL disponibles para descargar.
Para obtener Pretty Impresters trabajando en Windows (las instrucciones deben ser similares para otros sistemas operativos):
Requisitos previos
Asegúrese de tener instalado Python 2.7 y en la ruta del sistema.
Asegúrese de que esté instalado MinGW-get
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
Asegúrate de tener instalado un cliente SVN
Instalación:
Abra un comando Shell y escriba:
mingw-get install gdb-python
Cuando termine el cd en un directorio local e instale las impresoras, escriba:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
Abra .gdbinit (créelo en un editor de texto si es necesario) y escriba lo siguiente reemplazando "C: / directory" con la carpeta en la que ha comprobado las impresoras.
Pitón
import sys
sys.path.insert (0, ''C: / directorio'')
de libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (Ninguno)
fin
Configuración de Eclipse
- Vaya a Windows> Preferencias> C / C ++> Depurar> GDB
- Donde dice que GDB Debugger puso la ruta al GDB habilitado para Python lo más probable es que esté en la carpeta mingw / bin con un nombre como gdb-python27.exe
- Donde dice que el archivo de comando GDB puso la ruta al archivo .gdb init que hizo anteriormente.
Eso es todo, depurar como de costumbre, las estructuras stl deberían ser mucho más fáciles de leer.
Sé que JDT (entorno Java en eclipse) proporciona "formateadores" personalizados para aplicar cuando se muestran valores variables en vistas de depuración. Un vistazo rápido a google para el mismo en CDT trae esta página:
http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29
No sé si esto se ha integrado aún en la línea CDT principal, puede intentar hacer clic derecho en una variable mientras se depura (en el último CDT) y ver si hay una entrada personalizada de formateador. Si no está disponible, le recomiendo que agregue una nueva entrada de rastreador en el rastreador CDT para solicitar esta mejora.
Si tiene soporte gdb
para CDT
(consulte, por ejemplo, GDB en Eclipse ), puede intentar esto: eliminación de referencias de contenedores STL
Hace mucho tiempo también tropecé con tu mismo problema. Fue un dolor comprobar los contenedores de STL. Luego encontré ese enlace y agregué a mi archivo .gdbinit
algunas de esas definiciones. La vida fue más fácil después de eso.
NOTA: Mi versión de gdb
es 7.1 y agregar esas definiciones funciona bien. No sé si en las versiones más nuevas de gdb
ya están incluidas.