406 votes

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

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

542voto

therefromhere Points 21329
set print elements 0

Extrait du manuel GDB :

set print elements number-of-elements

Fixer une limite sur le nombre d'éléments d'un tableau que GDB imprimera. Si GDB imprime un tableau de grande taille, il arrête d'imprimer après avoir imprimé le nombre d'éléments défini par l'option set print elements commandement. Cette limite s'applique également à l'affichage des chaînes de caractères. Au démarrage de GDB, cette limite est fixée à 200. Réglage de nombre d'éléments à zéro signifie que l'impression est illimitée .

6 votes

De nos jours, vous pouvez également avoir besoin de "set print repeats 0", sinon GDB omettra les éléments répétés de la chaîne/du tableau.

0 votes

Cela s'applique également aux types de tableaux

1 votes

Vous pouvez également avoir besoin de "set max-value-size unlimited".

108voto

duskwuff Points 69245

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

2 votes

Cette réponse est encore meilleure que "set print elements 0" (pour mes besoins) car elle respecte les caractères de nouvelle ligne/retour chariot au lieu de les échapper.

7 votes

Bonne solution, mais ne fonctionne pas lorsque l'on essaie d'analyser le fichier de vidage du noyau.

0 votes

Brillante suggestion duskwuff, j'aurais aimé lire cela avant de le copier et coller dans un appel printf pour obtenir la sortie non encodée :D

50voto

korry Points 435

Le site printf imprimera les chaînes de caractères complètes :

(gdb) printf "%s\n", string

41voto

Wichert Akkerman Points 1127

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 de caractères, vous pouvez utiliser les commandes suivantes x/300s your_string . La sortie peut être un peu plus difficile à lire. Par exemple, l'impression d'une requête SQL donne le résultat suivant :

(gdb) x/300sb stmt.c\_str()
0x9cd948:    "SELECT article.r"...
0x9cd958:    "owid FROM articl"...
..

3 votes

Je me demandais ce que signifiait "x/300sb". Avec l'aide de ce antisèche (pdf) J'ai traduit "x/300sb cstr" par "eXamine 300 unités (octets) de mémoire à l'adresse cstr, interprétées comme une chaîne terminée par NULL (S)". Si votre chaîne a une longueur de 100, alors vous verrez beaucoup de déchets, parce que les 300 octets sont imprimés, qu'ils aient un sens ou non. +1 néanmoins pour m'avoir fait découvrir x ¡!

22voto

abstraktor Points 521

Juste pour le compléter :

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

Vous devez donner une longueur, mais vous pouvez modifier 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 voulez déboguer par leurs valeurs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X