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

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

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 la cantidad de elementos configurados 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 el número de elementos en cero significa que la impresión es ilimitada .

Siempre que su progtwig 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.

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, imprimir una consulta SQL da como resultado:

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

El comando printf imprimirá las cadenas completas:

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

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 quiere depurar por sus valores

Usar set elements ... no siempre es la mejor manera. Sería útil si hubiera un set string-elements ... distintos 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 es dependiente de c ++ lib ya que accede a miembros de std :: string, pero se ajusta fácilmente.
  • El segundo solo se puede usar en un progtwig en ejecución ya que llama a strlen.