2011-07-21 15 views
12

Estoy tratando de depurar un programa que no tiene un código fuente disponible, y necesito ver lo que ha almacenado en std :: string. He estado buscando en Google y mirando aquí, y he encontrado algo de información sobre la salida de contenedores STL, pero todo se refiere a variables, sin información de fuente o de depuración, todo lo que tengo es una compensación de memoria de los datos de clase. ¿Hay alguna manera de hacer esto?Cómo inspeccionar std :: string en GDB sin código fuente?

Respuesta

22

Cada implementación de std::string tiene un puntero a los caracteres en bruto en algún lugar. Para g++ 4.x, ese puntero está en el desplazamiento 0 en la cadena.

Si sabe que la cadena se encuentra, p. 0x7fffffffda88, entonces

print *(char**)0x7fffffffda88 

es lo que necesita.

+0

Gracias, que funcionó. Una cosa que me gustaría saber es cómo me imaginaría algo así. es decir, dado el código fuente para la clase 'X', ¿cómo averiguaría la posición de los campos dentro de esa clase? La única forma en que puedo pensar en este momento es compilar mi propia aplicación de prueba y examinar los punteros que se me dan (con offsetof, etc.). – PeterBelm

+1

La manera más rápida de descubrir el desplazamiento es, de hecho, compilar un programa de prueba trivial usando la clase dada en modo de depuración, y examinar los desplazamientos y el diseño de clase en GDB. Eso es exactamente lo que he hecho para responder a tu pregunta ;-) –

+2

Como un aparte, si el SSO se usa como en la libC++ de clang, no existe ese puntero para cadenas pequeñas. ;-) – Deduplicator

5

Quizás la opción más sencilla es utilizar el método c_str, como en:

print myStr.c_str() 
Cuestiones relacionadas