¿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?
6 answers
set print elements 0
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.
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.
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"... ..
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
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
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.
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