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


376

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?

Respuestas:


504
set print elements 0

Del manual de GDB :

set print elements number-of-elements
Establezca un límite sobre cuántos elementos de una matriz GDB se imprimirán. Si GDB está imprimiendo una gran matriz, deja de imprimir después de haber impreso el número de elementos establecidos por el set print elementscomando. 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 el número de elementos en cero significa que la impresión es ilimitada .

44
Hoy en día también puede necesitar "establecer repeticiones de impresión 0", de lo contrario, GDB omitirá elementos repetidos de la cadena / matriz.
John Lindgren

esto también se aplica a los tipos de matriz
Trevor Boyd Smith

1
También es posible que deba "establecer el valor máximo de tamaño ilimitado".
enms.

100

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


2
Esta respuesta es incluso mejor que "establecer elementos de impresión 0" (para mis propósitos) porque respeta los caracteres de retorno de línea / carro en lugar de escapar de ellos.
mhenry1384

66
Buena solución, pero no funciona al intentar analizar el archivo de volcado de núcleo
Elalfer

Sugerencia brillante duskwuff, desearía haberlo leído antes de copiarlo y pegarlo en una llamada printf para obtener la salida sin
escapes

44
Nota: esta opción solo funciona si está depurando un programa en vivo. No puede usar el comando "llamar" de GDB cuando está depurando un archivo central.
Solomon Slow

1
también requiere que gdb esté cuerdo, lo que cada vez más parece NO ser el caso (aparece "Sin símbolo" pone "en el contexto actual" en mi máquina Mac OS X)
Michael

39

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 que puede usar x/300s your_string. La salida puede ser un poco más difícil de leer. Por ejemplo, imprimir una consulta SQL da como resultado:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECCIONAR artículo.r" ...
0x9cd958: "owid FROM articl" ...
..

3
Me preguntaba qué significaba "x / 300sb". Con la ayuda de esta hoja de trucos (pdf) , traduje "x / 300sb cstr" como "eXamine 300 unidades (Bytes) de memoria en la dirección cstr, interpretada como una cadena terminada en NULL (S)". Si su cadena tiene una longitud de 100, verá mucha basura, ya que los 300 bytes están impresos, tengan sentido o no. ¡+1, sin embargo, por presentarme x!
Rob W

39

El printfcomando imprimirá las cadenas completas:

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

2
lo siento, pero esto no es cierto
UmNyobe

11
Esto parece respetar el set print elements nnnlímite y no imprimirá la cadena completa a menos que lo haga set print elements 0.
Mark Lakata

3
Cuando intento esto solo obtengo: "El valor no se puede convertir a entero".
Philipp Ludwig

2
para std :: string necesitas string.c_str () para evitar el error "El valor no se puede convertir a entero"
Paul Childs

21

Solo 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


1

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

Entonces, 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 usar en un programa en ejecución, ya que llama a strlen.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.