c++ c string debugging gdb

c++ - ¿Cómo imprimo el valor completo de una cadena larga en gdb?



string debugging (6)

Quiero imprimir la longitud completa de una cadena en C en GDB. Por defecto, se abrevia. ¿Cómo fuerzo a GDB a imprimir toda la cadena?


El comando printf imprimirá las cadenas completas:

(gdb) printf "%s/n", string


Hay una tercera opción: el comando x, que le permite establecer un límite diferente para el comando específico en lugar de cambiar una configuración global. Para imprimir los primeros 300 caracteres de una cadena, puede utilizar x/300s your_string . La salida puede ser un poco más difícil de leer. Por ejemplo imprimiendo resultados de una consulta SQL en:

(gdb) x/300sb stmt.c_str() 0x9cd948: "SELECT article.r"... 0x9cd958: "owid FROM articl"... ..


Sólo para completarlo:

(gdb) p (char[10]) *($ebx) $87 = "asdfasdfe/n"

Debe dar una longitud, pero puede cambiar la representación de esa cadena:

(gdb) p/x (char[10]) *($ebx) $90 = {0x61, 0x73, 0x64, 0x66, 0x61, 0x73, 0x64, 0x66, 0x65, 0xa}

Esto puede ser útil si desea depurar por sus valores


Siempre que su programa se encuentre en un estado call (void)puts(your_string) , también puede call (void)puts(your_string) para imprimirlo en stdout. El mismo principio se aplica a todas las funciones disponibles para el depurador, en realidad.


Usar set elements ... no siempre es la mejor manera. Sería útil si hubiera un set string-elements ... distinto set string-elements ...

Entonces, yo uso estas funciones en mi .gdbinit:

define pstr ptype $arg0._M_dataplus._M_p printf "[%d] = %s/n", $arg0._M_string_length, $arg0._M_dataplus._M_p end define pcstr ptype $arg0 printf "[%d] = %s/n", strlen($arg0), $arg0 end

Advertencias:

  • El primero depende de c ++ lib ya que accede a los miembros de std :: string, pero se ajusta fácilmente.
  • El segundo solo se puede utilizar en un programa en ejecución ya que llama a strlen.

set print elements 0

Del manual de GDB :

set print elements number-of-elements
Establezca un límite en la cantidad de elementos de una matriz que se imprimirá GDB. Si GDB está imprimiendo una matriz grande, deja de imprimir después de haber impreso el número de elementos establecido por el comando set print elements . Este límite también se aplica a la visualización de cadenas. Cuando se inicia GDB, este límite se establece en 200. Establecer la cantidad de elementos en cero significa que la impresión es ilimitada .