A veces gdb imprime "tipo incompleto" para algunos tipos de variables. ¿Qué significa esto y cómo podemos ver ese valor?Cómo imprimir la variable <tipo incompleto> en gdb
Respuesta
Significa que el tipo de esa variable se ha especificado de forma incompleta. Por ejemplo:
struct hatstand;
struct hatstand *foo;
BGF sabe que foo
es un puntero a una estructura hatstand
, pero no se han definido los miembros de esa estructura. Por lo tanto, "tipo incompleto".
Para imprimir el valor, puede convertirlo a un tipo compatible.
Por ejemplo, si se sabe que foo
es realmente un puntero a una estructura lampshade
:
print (struct lampshade *)foo
O bien, puede imprimir como un puntero genérico, o lo trata como si fuera un entero:
print (void *)foo
print (int)foo
Véase también estas páginas del manual de GDB:
Lo que he encontrado es que si se desmonta una función que utiliza el tipo de estructura GDB incompleta 'descubre' los miembros de la estructura y, posteriormente, puede mostrarlos. Por ejemplo, supongamos que tiene una estructura de cadena:
struct my_string {
char * _string,
int _size
} ;
algunas funciones para crear y obtener la cadena a través de puntero:
my_string * create_string(const char *) {...}
const char * get_string(my_string *){...}
y una prueba que crea una cadena:
int main(int argc, char *argv[]) {
my_string *str = create_string("Hello World!") ;
printf("String value: %s\n", get_string(str)) ;
...
}
Ejecútelo en gdb e intente 'imprimir * str' y obtendrá una respuesta de 'tipo incompleto'. Sin embargo, intente 'disassemble get_string' y luego 'print * str' y mostrará la estructura y los valores correctamente. No tengo idea de por qué esto funciona, pero lo hace.
Tuve el mismo problema. Si carga los símbolos de las bibliotecas de forma manual:
set auto-solib-add off
attach thread_id
shared any_lib
shared another_lib
necesita cargar los símbolos de la biblioteca, donde se declara este objeto, con el mismo comando también.
No conozco el significado completo del error, pero como señala Peter, el desmontaje de un método relacionado hace algo que hace que algunas de estas definiciones de tipo estén disponibles.
Mi ejemplo:
En el .h para una clase, que incluía una declaración de clase delante de una clase de ayuda interior para que la clase externa podría contener un puntero a ella. El .cpp correspondiente tenía la definición completa de la clase de ayuda interna.
Al romper en un método de la clase externa, gdb informó el tipo incompleto para una desreferencia del puntero a la instancia de clase interna a través de una instancia de la clase externa.
Emitir el comando disasemble en uno de los métodos en la clase externa permitió a gdb comprender la estructura de la clase interna utilizando el mismo puntero que falló anteriormente.
- 1. Cómo imprimir una variable en una condición particular en gdb?
- 2. Cómo imprimir wstring en gdb
- 3. ¿Cómo imprimir en modo binario en gdb?
- 4. Cómo imprimir matrices Fortran en GDB?
- 5. ¿Cómo imprimir valores de registro en GDB?
- 6. Imprimir tablas C++ usando GDB
- 7. operador de llamadas << en gdb
- 8. Imprimir caracteres de un vacío * en gdb
- 9. Cómo imprimir bastante los contenedores STL en GDB?
- 10. gdb - cómo imprimir el resultado de la evaluación para C++
- 11. GDB variable no utilizada
- 12. Cómo imprimir una estructura C recursivamente en gdb
- 13. cómo imprimir el valor de std :: map en gdb
- 14. imprimir nombre de la variable en C#
- 15. Imprimir en ERB sin <% =?
- 16. Cómo imprimir/registrar la dirección de una variable en NDK
- 17. cómo imprimir variable dentro de awk
- 18. ¿Está <value optimised out> en gdb un problema?
- 19. ¿Cómo imprimo una matriz Java en gdb?
- 20. Cast <T>() con una variable de tipo
- 21. ¿Cómo puedo imprimir la dirección de memoria de una variable?
- 22. Cómo imprimir la cadena a la que apunta un puntero mientras se depura usando gdb?
- 23. Algo así como imprimir END << END; en C++?
- 24. latex: imprimir una variable en números romanos
- 25. gdb | vea la lista de argumentos de variable
- 26. GDB: Cómo identificar el número de línea de la declaración de variable de una variable específica para la función actual en gdb
- 27. ¿Cómo imprimir el nombre de una variable en C++?
- 28. Redirigir/almacenar salida de shell en variable GDB?
- 29. ¿Qué significa <value optimised out> en gdb?
- 30. ¿Cómo enumerar los métodos de clase en gdb?
Buena respuesta, aunque los enlaces son 404. –
Solucionado. No recuerdo a qué estaban vinculados anteriormente, pero estos dos enlaces deberían ser útiles :). –