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?¿Cómo imprimo el valor completo de una cadena larga en gdb?
Respuesta
set print elements 0
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.
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.
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
Buena solución, pero no funciona al intentar analizar el archivo de volcado del núcleo – Elalfer
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
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"... ..
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'! –
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
El comando printf se imprimirá por completo cadenas:
(gdb) printf "%s\n", string
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.
debe ser 'set print elements ...' not 'set elements' ... – NoahR
- 1. ¿Cómo imprimo una matriz Java en gdb?
- 2. ¿Cómo imprimo los elementos de un vector C++ en GDB?
- 3. ¿Cómo declarar una cadena larga en Python?
- 4. WinDbg y SoS, ¿cómo imprimo/vuelco una cadena grande?
- 5. ¿Cómo imprimo una cadena no terminada en nulo usando printf?
- 6. Definición de una cadena larga en Razor
- 7. ¿Cómo imprimo el valor de este booleano? (Java)
- 8. Python truncar una cadena larga
- 9. ¿cómo imprimo una lista en haskell?
- 10. ¿Cómo imprimir valores de registro en GDB?
- 11. Cómo caber una cadena larga en una etiqueta JLabel
- 12. ¿Cómo imprimo el valor del puntero de un objeto Go? ¿Qué significa el valor del puntero?
- 13. Cómo convertir cadena a larga
- 14. ¿Cómo comprimir/descomprimir una cadena de consulta larga en PHP?
- 15. cómo imprimir el valor de std :: map en gdb
- 16. ¿Cómo imprimo una matriz multidimensional en ruby?
- 17. ¿Cómo imprimo CFStringRef en una acción de DTrace?
- 18. Cómo manejar una cadena larga declaración SQL en Python
- 19. ¿Cómo imprimo cualquier valor después de llamar al método Main()?
- 20. ¿Cómo puedo citar una cadena larga en Perl?
- 21. ¿Cómo imprimo el carácter '%' con 'printf'?
- 22. Cómo filtrar de manera eficiente una cadena contra una larga lista de palabras en Python/Django?
- 23. ¿Cómo leo el valor de todos los registros con gdb?
- 24. Convertir cadena hexadecimal a larga
- 25. Encontrar la secuencia repetitiva más larga en una cadena
- 26. ¿Por qué obtengo el mismo valor cuando imprimo este int?
- 27. Resaltar cadenas específicas en una cadena larga dada en Javascript
- 28. Expresando cadena larga de composiciones en Haskell
- 29. ¿Cómo inspeccionar el valor de retorno de una función en GDB?
- 30. ¿Cómo puedo encontrar la cadena más larga en Python?
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. –