2011-07-21 3 views
12

J'essaye de déboguer un programme qui n'a aucun code source disponible, et j'ai besoin de regarder ce qu'il a stocké dans une chaîne std :: string. J'ai étudié Google et regardé ici, et j'ai trouvé quelques informations sur la sortie des conteneurs STL, mais tout cela se réfère à des variables, sans source ou informations de débogage tout ce que j'ai est un décalage de mémoire des données de classe. Est-ce qu'il y a un moyen de faire ça?Comment inspecter std :: string dans GDB sans code source?

Répondre

22

Chaque implémentation std::string a un pointeur vers les caractères bruts quelque part. Pour g++ 4.x, ce pointeur est décalé de 0 dans la chaîne.

Si vous savez que la chaîne réside, par ex. 0x7fffffffda88, puis

print *(char**)0x7fffffffda88 

est ce dont vous avez besoin.

+0

Merci, qui a travaillé. Une chose que j'aimerais savoir, c'est comment je pourrais imaginer quelque chose comme ça par moi-même. c'est-à-dire donné le code source de la classe 'X' comment est-ce que je trouverais la position des champs dans cette classe? La seule façon dont je peux penser en ce moment est de compiler ma propre application de test et d'examiner les pointeurs que je reçois (avec offsetof, etc.). – PeterBelm

+1

Le moyen le plus rapide de comprendre le décalage est en fait de compiler un programme de test trivial utilisant la classe donnée en mode débogage, et d'examiner les offsets et la disposition des classes dans GDB. C'est exactement ce que j'ai fait pour répondre à votre question ;-) –

+2

En passant, si SSO est utilisé comme dans libC++ de clang, il n'y a pas de tel pointeur pour les petites chaînes. ;-) – Deduplicator

5

Peut-être la meilleure option est d'utiliser la méthode c_str, comme dans:

print myStr.c_str()