¿Cómo resaltar y colorear la salida de gdb durante la depuración interactiva?

172

No responda. Debería usar ddd, nemiver, emacs, vim o cualquier otro front-end, solo prefiero gdb como es, pero me gustaría ver su salida con algunos colores de terminal.

elmarco
fuente
44
No le dará colores (así que no llamaré a esto una respuesta), pero alguna configuración ~ / .gdbinit mejorará la experiencia. Lo uso como mínimo: establecer historial guardar en conjunto imprimir bastante conjunto output-radix 16 conjunto altura 0
activout.se
Sería bueno cambiar la respuesta aceptada para que mi antigua respuesta incorrecta se pueda eliminar. Gracias.
ddaa
Una vez más destacado en la línea actual lse implementa sourceware.org/bugzilla/show_bug.cgi?id=21044 , voy a añadir la una hook-stopy entro Dev Nirvana.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

183

.gdbinit

Puede ajustar su ~/.gdbinitpara tener colores. Puede usar mammon's, .gdbinitque está disponible aquí:

https://github.com/gdbinit/gdbinit

Puedes ajustarlo todo lo que quieras también. Encontré esto gracias a esta respuesta SO . Este es el tipo de salida que puede obtener:

.gdbinit

También está disponible un repositorio de GitHub: https://github.com/gdbinit/Gdbinit

En una nota al margen, la misma idea también se aplicó a lldb .

Panel de GDB

Siguiendo el mismo concepto, GDB Dashboard proporciona una interfaz visual modular para GDB en Python.

Panel de GDB

(vacío) caminante

Otro proyecto similar utiliza el soporte Python de GDB para proporcionar más extensibilidad, por lo que vale la pena echarle un vistazo: https://github.com/dholm/voidwalker

@dholm también proporciona su propio .gdbinit inspirado en el anterior.

(vacío) caminante

pwndbg

Algunos proyectos proporcionan un conjunto de funciones útiles, incluida una visualización mejorada. Este es el caso de PEDA o pwndbg . Este último da la siguiente descripción:

Un reemplazo de PEDA. En el espíritu de nuestro buen amigo windbg, pwndbgse pronuncia pwnd-bag.

  • Velocidad
  • Resistencia
  • Código limpio

Proporciona comandos para admitir la depuración y el desarrollo de exploits similares a los de PEDA, y una mejor visualización (aunque este no es el enfoque principal del proyecto). El software todavía está en desarrollo y aún no se ha lanzado correctamente.

pwndbg

Voltron

La descripción del proyecto establece:

Voltron es una interfaz de usuario de depurador extensible para hackers. Le permite adjuntar vistas de utilidades que se ejecutan en otros terminales a su depurador (LLDB o GDB), mostrando información útil como el desmontaje, el contenido de la pila, los valores de registro, etc., mientras le brinda la misma CLI de depurador a la que está acostumbrado.

Puede modificar su .gdbinitpara integrarlo automáticamente. Sin embargo, la pantalla en sí está fuera de GDB (por ejemplo, en una división tmux).

Voltron

FMAM

El FMAM es otra opción, y se describe como:

Está destinado a ser utilizado principalmente por explotadores e ingenieros inversos, para proporcionar funciones adicionales a GDB utilizando la API de Python para ayudar durante el proceso de análisis dinámico y desarrollo de exploits.

FMAM

BenC
fuente
muchas gracias por su respuesta, ¿tiene alguna idea de cómo desactivar la salida de registro? (Estoy usando gdb para el código C ++ y no necesito ningún nivel de ensamblador de inmediato)
vak
si. Maldición "Los comentarios deben tener al menos 15 caracteres de longitud".
vak
1
@vak intentaste set $SHOWCPUREGISTERS = 0? Básicamente, tiene varios parámetros que puede establecer , y siempre puede modificar el código para satisfacer sus necesidades.
BenC
100

No son colores, pero considera la gui de texto de gdb . Hace una gran diferencia en qué tan usable es gdb.

Puedes lanzarlo con:

gdb -tui executable.out

Captura de pantalla:

ingrese la descripción de la imagen aquí

Como puede ver, las características principales son:

  • muestra en qué línea de la fuente estamos y las líneas circundantes
  • muestra puntos de interrupción
John Carter
fuente
55
¡Guauu! ¡Gracias! He estado buscando durante mucho tiempo un buen shell gráfico alrededor de gdb, y he intentado xxgdb, kgdb y ddd, pero ninguno de ellos funcionó muy bien para mí, así que me he quedado con la interfaz de línea de comando antigua. ¡Pero esto es absolutamente perfecto!
Thomas Padron-McCarthy
46
Ctrl-x Ctrl-a: Ingrese esto para cambiar hacia y desde el modo gui de texto, funciona incluso sin la opción de línea de comando.
jturcotte
2
Imprimir en stdout desde el programa rompe la interfaz para mí. ¿Alguna solución además de redirigirlo?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Tengo el mismo problema con stdout rompiendo la interfaz. Ctrl-L o lo que sea que sea su enlace de redibujado lo hace utilizable al menos. Para las personas con el modo de edición vi habilitado, Ctrl-X Ctrl-A no funciona, pero el comando 'layout src' lo pondrá en modo TUI con la fuente mostrada como la imagen.
wilywampa
1
Abra una segunda terminal y luego emita el comando: $ tty Use el resultado para dirigir stdout desde la sesión de gdb a esa terminal usando el comando (gdb) set inferior-tty. ex. desde mi .gdbinit set inferior-tty / dev / tty2 ahora tu stdout no arruinará $ gdb -tui.
netskink
46

Sé que no querías una interfaz. Pero qué tal cgdb está muy cerca de gdb, es un modo de texto pero tiene una ventana de origen arriba con resaltado de sintaxis en el código.

Johan
fuente
2
sudo apt-get install cgdb
cs01
2
Una verdadera casualidad :)
Ignorante
Solo intenté ejecutarlo: no ve ningún historial de gdb, y también tiene un mensaje jodido, donde hay un espacio en blanco entre el cursor y el lugar real donde se escribe el símbolo (esto es probable porque tengo un mensaje de color en gdb ) . No me impresionó en absoluto.
Hola Ángel
19

Es posible mejorar en gran medida la apariencia de gdb mediante el uso de colores. Esto se realiza a través de cualquiera de los siguientes métodos:

  1. Aviso coloreado a través del "aviso establecido". Por ejemplo, haga que el mensaje aparezca en negrita y rojo:

    set prompt \033[1;31m(gdb) \033[m

    o haga que el indicador tenga una nueva forma, negrita y roja:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    ingrese la descripción de la imagen aquí

  2. Comandos coloreados a través de ganchos

  3. Resaltado de sintaxis coloreada del comando "lista".

Todos los ejemplos están disponibles en las siguientes publicaciones de blog escritas por Michael Kelleher:

"Beautify GDB", 12 de mayo de 2010 (a través de archive.org)

"Resaltado de sintaxis GDB experimental", 15 de mayo de 2010 (a través de archive.org)

Miguel
fuente
14
Los enlaces están rotos.
John Carter
77
@ Mike: sería útil publicar el contenido de esos enlaces aquí ya que el sitio ya no es accesible y robots.txt impidió que archive.org lo indexara.
Lucian Adrian Grijincu
1
Puede obtener la información relevante aquí: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Los enlaces ahora apuntan a una memoria caché archive.org de las publicaciones del blog.
Alex Quinn
1
@ Mike, parece que eres el autor de las publicaciones del blog; Si es así, debe revelar eso en la respuesta.
David Z
13

¡Nuevo en el próximo GDB 8.3!

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

El estilo de terminal ahora está disponible para la CLI y la TUI. GNU Source Highlight también se puede utilizar para proporcionar estilo a los fragmentos de código fuente. Consulte los comandos "establecer estilo", a continuación, para obtener más información.

captura de pantalla de gdb 8.2.91.20190401-23.fc30

elmarco
fuente
¡La mejor respuesta! Puede encontrar aquí un tutorial sobre cómo instalar gdb 8.3 medium.com/@simonconnah/… , tenga en cuenta que su máquina necesita al menos 512 MB de RAM, de lo contrario, el gcccompilador comenzará a desecharse.
usuario
7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

Advertencia: Buggy. No es compatible con TUI, hack de 'modo de usuario'.

Encontré la parte principal aquí y la modifiqué un poco. Necesita resaltado, c ++ filt. Si los colores se desordenan, vuelva a ejecutar el comando.

ftk
fuente
7

cgdb es mucho mejor que gdb -tui

justin.yqyang
fuente
Convenido. Las líneas simples impresas por mi programa destrozaron la consola de gdb -tui. Esto no sucede bajo cgdb. ¡Gracias por el consejo!
Randall Cook
4

Quería resaltar lo siguiente: enfatizar las líneas de un seguimiento de pila que pertenecen a mis archivos fuente (en lugar de bibliotecas).

La solución fue usar gdb-python (en MSYS; ¿en Linux normalmente gdbviene con Python incorporado?), Enganchar backtrace, usar

python stack_trace = gdb.execute('backtrace', False, True')

Luego procese stack_tracecon expresiones regulares de Python e imprímalas. Los colores llamativos y otros se logran mediante una función como esta:

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)
Evgeni Sergeev
fuente
Un ejemplo de trabajo que use el gancho, aunque sea mínimo, probablemente sería más bienvenido.
Hola Ángel
4

Otra buena combinación de colores está dada por esta configuración . Hace que la inspección de los rastreos sea mucho más fácil. Para usarlo, simplemente guarde ese archivo como ~/.gdbinity ejecute gdb normalmente

Andrea Araldo
fuente
Gracias, esto era precisamente lo que estaba buscando. Estaba buscando una aplicación multiproceso con una larga pila de llamadas y esto es perfecto para esos retrocesos.
Johan Bjäreholt
-2

puedes obtener los colores que quieras;

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
RandomNickName42
fuente