¿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?

John Carter
fuente

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 .
John Carter
fuente
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.

duskwuff -inactive-
fuente
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" ...
..
Wichert Akkerman
fuente
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
korry
fuente
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

abstraktor
fuente
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.
mrtimdog
fuente