Comment imprimer la valeur complète d'une longue chaîne dans gdb?

376

Je veux imprimer toute la longueur d'une chaîne C dans GDB. Par défaut, il est abrégé, comment puis-je forcer GDB à imprimer la chaîne entière?

John Carter
la source

Réponses:

504
set print elements 0

Du manuel GDB :

set print elements number-of-elements
Définissez une limite sur le nombre d'éléments d'un tableau que GDB imprimera. Si GDB imprime un grand tableau, il arrête l'impression après avoir imprimé le nombre d'éléments défini par la set print elementscommande. Cette limite s'applique également à l'affichage des chaînes. Lorsque GDB démarre, cette limite est fixée à 200. La définition du nombre d'éléments à zéro signifie que l'impression est illimitée .
John Carter
la source
4
De nos jours, vous pourriez également avoir besoin de "set print repeats 0", sinon GDB supprimera les éléments répétés de la chaîne / du tableau.
John Lindgren
cela s'applique également aux types de tableaux
Trevor Boyd Smith
1
Vous devrez peut-être également "définir la valeur maximale-taille illimitée".
Ams
100

Tant que votre programme est dans un état sain, vous pouvez également l' call (void)puts(your_string)imprimer sur stdout. Le même principe s'applique à toutes les fonctions disponibles pour le débogueur, en fait.

duskwuff -inactif-
la source
2
Cette réponse est encore meilleure que "set print elements 0" (pour mes besoins) car elle respecte les caractères retour retour chariot / retour au lieu de les échapper.
mhenry1384
6
Bonne solution, mais ne fonctionne pas en essayant d'analyser le fichier de vidage de
mémoire
Brilliant suggestion duskwuff, j'aurais aimé l'avoir lu avant de le copier et de le coller dans un appel printf pour obtenir la sortie non
échappée
4
Remarque: cette option ne fonctionne que si vous déboguez un programme en direct. Vous ne pouvez pas utiliser la commande "call" de GDB lorsque vous déboguez un fichier core.
Solomon Slow
1
nécessite également que gdb soit sain d'esprit, ce qui semble de plus en plus ne pas être le cas (je reçois "Aucun symbole" place "dans le contexte actuel" sur ma machine Mac OS X)
Michael
39

Il existe une troisième option: la commande x, qui vous permet de définir une limite différente pour la commande spécifique au lieu de modifier un paramètre global. Pour imprimer les 300 premiers caractères d'une chaîne, vous pouvez utiliser x/300s your_string. La sortie peut être un peu plus difficile à lire. Par exemple, l'impression d'une requête SQL entraîne:

(gdb) x / 300sb stmt.c_str ()
0x9cd948: "SELECT article.r" ...
0x9cd958: "owid FROM articl" ...
..
Wichert Akkerman
la source
3
Je me demandais ce que voulait dire "x / 300sb". Avec l'aide de cette feuille de triche (pdf) , j'ai traduit "x / 300sb cstr" par "eXamine 300 unités (octets) de mémoire à l'adresse cstr, interprétée comme une chaîne terminée par NULL (S)". Si votre chaîne a une longueur de 100, vous verrez beaucoup de déchets, car les 300 octets sont imprimés, qu'ils aient du sens ou non. +1 quand même pour m'avoir présenté x!
Rob W
39

La printfcommande affichera les chaînes complètes:

(gdb) printf "%s\n", string
Korry
la source
2
désolé mais ce n'est pas vrai
UmNyobe
11
Cela semble respecter la set print elements nnnlimite et n'imprimera pas la chaîne complète à moins que vous ne le fassiez set print elements 0.
Mark Lakata
3
Quand j'essaye ceci j'obtiens seulement: "La valeur ne peut pas être convertie en entier".
Philipp Ludwig
2
pour std :: string, vous avez besoin de string.c_str () afin d'éviter l'erreur "La valeur ne peut pas être convertie en entier"
Paul Childs
21

Juste pour le compléter:

(gdb) p (char[10]) *($ebx)
$87 =   "asdfasdfe\n"

Vous devez donner une longueur, mais vous pouvez changer la représentation de cette chaîne:

(gdb) p/x (char[10]) *($ebx)
$90 =   {0x61,
  0x73,
  0x64,
  0x66,
  0x61,
  0x73,
  0x64,
  0x66,
  0x65,
  0xa}

Cela peut être utile si vous souhaitez déboguer en fonction de leurs valeurs

abstraktor
la source
1

L'utilisation set elements ...n'est pas toujours la meilleure façon. Il serait utile qu'il y ait une distinction set string-elements ....

Donc, j'utilise ces fonctions dans mon .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

Mises en garde:

  • Le premier dépend de la lib c ++ car il accède aux membres de std :: string, mais est facilement ajusté.
  • Le second ne peut être utilisé que sur un programme en cours d'exécution car il appelle strlen.
mrtimdog
la source