2008-10-24 7 views

Respuesta

418
set print elements 0 

From the GDB manual:

set print elements number-of-elements
establecer un límite en el número de elementos de una matriz de GDB se imprimirá. Si GDB está imprimiendo una matriz grande, deja de imprimir después de imprimir el número de elementos establecidos 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. Configuración número de elementos a cero significa que la impresión es ilimitada.
+0

Hoy en día es posible que también necesite "establecer repeticiones de impresión 0", de lo contrario, GDB omitirá los elementos repetidos de la cadena/matriz. –

86

Mientras su programa esté en buen estado, 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.

+1

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

+4

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

+0

Brilliant suggestion Duskwuff, desearía haberlo leído antes de copiarlo y pegarlo en una llamada printf para obtener la salida sin escapes ..: D – nevelis

29

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 usar x/300s your_string. La salida puede ser un poco más difícil de leer. Por ejemplo la impresión de una consulta SQL resultados en:

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

Me preguntaba qué significaba "x/300sb". Con la ayuda de esta [hoja de referencia (pdf)] (http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf), he traducido "x/300sb cstr" como "eXamine 300 unidades (bytes) de memoria en la dirección cstr, interpretada como una cadena con terminación NULL (S). ". Si su cadena tiene una longitud de 100, verá mucha basura, porque los 300 bytes están impresos, ya sea que tengan sentido o no. +1 sin embargo, por presentarme a 'x'! –

15

Sólo para completarlo:

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

le tiene que 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

21

El comando printf se imprimirá por completo cadenas:

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

Gracias, esto funcionó en mi caso – BSalunke

+1

lo siento, pero esto no es cierto – UmNyobe

+1

Esto parece respetar el límite 'set print elements nnn', y no imprimirá la cadena completa a menos que haga' set print elements 0'. –

1

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

Por lo tanto, utilizar 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:

  • La primera es C++ lib dependiente, ya que tiene acceso a los miembros de std :: string, pero es fácilmente ajustable .
  • El segundo solo se puede usar en un programa en ejecución, ya que llama a strlen.
+0

debe ser 'set print elements ...' not 'set elements' ... – NoahR

Cuestiones relacionadas