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


Quiero imprimir la longitud completa de una cadena C en GDB. De forma predeterminada se está abreviando, ¿cómo fuerzo a GDB a imprimir toda la cadena?

Author: John Carter, 2008-10-24

6 answers

set print elements 0

Del manual del BGF :

set print elements number-of-elements
Establezca un límite sobre cuántos elementos de un array GDB imprimirá. Si GDB está imprimiendo una matriz grande, deja de imprimirla después de haber impreso 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. Establecer número de elementos a cero significa que la impresión es ilimitada.
 437
Author: John Carter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-29 21:58:38

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.

 90
Author: duskwuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-31 10:42:56

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 resulta en:

(gdb) x/300sb stmt.c_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..
 30
Author: Wichert Akkerman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-06 16:15:39

El comando printf imprimirá las cadenas completas:

(gdb) printf "%s\n", string
 22
Author: korry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-20 09:17:32

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

 16
Author: abstraktor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 11:05:52

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

Por lo tanto, utilizo 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 la lib de c++, ya que accede a 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.
 1
Author: mrtimdog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-23 07:08:33