¿Cómo habilitar gdb pretty printing para objetos C++ STL en Eclipse CDT?


Estoy tratando de agregar una impresión bonita para objetos STL en eclipse cdt. Traté de seguir los pasos descritos aquí:

Http://sourceware.org/gdb/wiki/STLSupport

Revisé la carpeta python, pero parece que no puedo hacer esto...

He creado un gdbinit y seleccionado para mi configuración de depuración, pero cada vez que intento iniciar la depuración obtengo el siguiente error:

Error while executing Python code.
!STACK 0
java.lang.Exception: /home/lizardking/workspace/eu.sofia.kpi.cpp.x86.testapp/.gdbinit:6: Error in sourced command file:
Error while executing Python code.
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.processMIOutput(AbstractMIControl.java:824)
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.run(AbstractMIControl.java:662)

Si intento ejecutar el contenido de gdbinit en un shell python, obtengo esto error:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import sys
sys.path.insert(0, '/home/Documents/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libstdcxx.v6.printers

Parece que no tengo tal módulo...No tengo ni idea de Python, así que ni siquiera sé qué es un" módulo " en Python....

¿Alguien puede ayudarme con esto? Es muy importante para mí poder ver información de depuración real, o útil para decirlo de esa manera. O de alguna manera puedo depurar incluso desde la consola y obtener una buena salida de gdb, porque si voy a imprimir una cadena, por ejemplo, obtengo una salida inútil....

Saludos, Alex

5 answers

Esta es la solución que funciona para mí.

Descargar ( http://www.gnu.org/software/gdb/download / ) e instala el último gdb (es decir, con el prefijo HOME HOME). Soporta scripting python.

Obtenga impresoras python pretty ejecutando

Svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

En un directorio de su elección (por ejemplo $(HOME)/distribs/gdb_printers). Obtendrá el subdirectorio 'python' en el directorio de pago.

Pon esto en tu $(CASA)/.archivo gdbinit con la ruta correcta a las impresoras pretty:

python
import sys 
sys.path.insert(0, '/home/YOUR_NAME_HERE/distribs/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

Esto hace que la impresión sea bastante utilizable a través de la interfaz de línea de comandos de gdb ( >(gdb) p my_std_string).

A continuación se explica el uso durante la depuración en Eclipse.

Descargar ( http://download.eclipse.org/eclipse/downloads / ) última versión estable de Eclipse (>=versión 3.7).

Descargar ( http://download.eclipse.org/tools/cdt/builds/8.0.0/index.html para Eclipse Indigo o http://www.eclipse.org/cdt/downloads.php para Eclipse Juno) últimas herramientas de desarrollo Eclipse C/C++ (Eclipse CDT).

Ejecute Eclipse y elija el directorio workspace donde se almacenarán sus opciones (es decir, HOME HOME/projects). Haga clic en Ayuda- > Instalar Nuevo Software... Haga clic en Agregar...->Archivo... y elija la compilación CDT que acaba de descargar. Luego debe elegir componentes para instalar: haga clic en Características principales de CDT - > Herramientas de desarrollo C/C++ (y posiblemente otros componentes de su elección). Entonces continúe con la instalación y reinicie Eclipse.

Especifique la ubicación adecuada de gdb y.gdbinit en Eclipse y asegúrese de que la opción de impresión Bonita está habilitada:

Window -> preferences -> C/C++ -> Debug -> GDB

Ahora puede ver los contenedores STL bastante impresos en la vista de variables mientras depura en Eclipse.

Se pueden usar otros comandos para hacer que la salida gdb sea más decente:

set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3
set print sevenbit-strings off

ACTUALIZACIÓN: Con respecto a conseguir que funcione para proyectos antiguos, consulte el punto 4) en la respuesta de rustyx a continuación.

ACTUALIZACIÓN 2: ubuntu 12.04 tiene libstdc++6-4. 6-dbg que instala el módulo /usr/share/gcc-4.6/python/libstdcxx/ python para usted

 57
Author: Riga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-02 17:49:47

Sé que esto no responde a la pregunta original, pero pensé que podría ser útil para aquellos que depurar en Eclipse Windows / MinGW. El procedimiento para Windows es similar:

1) Obtenga Python 2.7.x de http://python.org/download /

2) Crear .gdbinit algún lugar que contenga algo como 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

3) Configure Eclipse CDT para usar C:\MinGW\bin\gdb-python27.exe como depurador y su .gdbinit como archivo de configuración.

4) Vuelva a crear su sesión de inicio de depuración (eliminar el viejo y crear uno nuevo desde cero).

 9
Author: rustyx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-02 17:17:43

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/comando y use MinGW-get.exe para 'instalar' GDB habilitado para Python, por ejemplo,

   MinGw-get.exe install gdb-python

1a) Obtenga Python 2.7.x de http://python.org/download / e instalar

1b) Asegúrese de que PYTHONPATH y PYTHONHOME estén configurados en su entorno:

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c) Añadir PYTHONHOME a su PATH

 %PYTHONHOME%;...

2a) Abra un texto enter, introduzca las siguientes instrucciones. Observe que la 3ra línea es señalando dónde se encuentran los scripts de python. Ver 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 con un período de explorador. La mayoría de las ediciones de texto (incluido el bloc de notas) lo permitirán. GDB init los archivos son como 'scripts' de comandos GDB que GBD ejecutará al cargarlos.

2c) El ".gdbinit" el archivo debe estar en el directorio de trabajo de GDB (lo más probable es que su directorio raíz de proyectos, pero su IDE puede decirle.

3) Abra el diálogo de preferencias de Eclipse (u otro IDE). Vaya al submenú Depurador de C++.

4) Configure Eclipse para usar C:\MinGW\bin\gdb-python27.exe como depurador y su .gdbinit como archivo de configuración.

5a) Vuelva a crear todas sus configuraciones de inicio de depuración (elimine la antigua y cree una nueva desde cero).

--OR--

5b) Editar cada configuración de depuración y apunta al nuevo gdb-python.exe Y señalarlo a la.

Si te encuentras con problemas:

't ¡No olvide cambiar la ubicación al directorio python en el código python anterior! Este directorio es creado por MinGW, así que no busque descargar las impresoras pretty, MinGW lo hice por ti en el paso cero. Solo tienes que ir a tu director de instalación de 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 script python cargado por GDB.

Also También, el .gdbinit es un PITA, asegúrese de que su nombre correctamente y en la carpeta de trabajo de GDB que no es necesariamente donde gdb-python.exe se encuentra! Mire su salida GDB al cargar GDB para ver si a) 'python-enabled' aparece durante la carga y que las instrucciones en el .gdbinit están apareciendo.

Finally 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.

The El directorio con ' gdb-python27 '(e. g. C:\MinGW\bin') también debe estar en su camino y si lo está, hace que la configuración de eclipse sea un poco más agradable porque no necesita poner en caminos absolutos. Pero aún así, a veces el .gbdinit necesita un camino absoulte. si funciona, verá la salida de gbd (console->gdb traces) así al iniciar el 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) 
 4
Author: William Symionow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-10 20:35:36

Si sigues la respuesta aceptada y UPDATE2 y gdb recibe un error como este:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/usr/share/gcc-4.8/python/libstdcxx/v6/printers.py", line 54
    raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
                ^
SyntaxError: invalid syntax
/home/[you]/.gdbinit:6: Error in sourced command file:
Error while executing Python code.

Es porque su versión de gdb está usando Python 3 (confirme con esta respuesta)

Una solución para este problema se explica aquí

Alternativamente, siga las instrucciones para obtener el código fuente de svn://gcc.gnu.org, que es compatible con Python 3

 2
Author: acel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:10

Para mostrar objetos STL en Eclipse CDT, hago esto y funciona bien:

Http://www.yolinux.com/TUTORIALS/GDB-Commands.html#STLDEREF

(opción número 2 en el enlace que envió)

Espero que esto ayude

 1
Author: Bob Yoplait,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-13 17:11:25