web-dev-qa-db-fra.com

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

Je veux imprimer toute la longueur d'une chaîne C dans GDB. Par défaut, comment est-ce que je force GDB à imprimer toute la chaîne?

352
John Carter
set print elements 0

extrait du manuel GDB :

set print elements number-of-elements
Définissez une limite quant au 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 la commande set print elements. Cette limite s'applique également à l'affichage des chaînes. Au démarrage de GDB, cette limite est définie sur 200. Réglage nombre d'éléments à zéro signifie que l'impression est illimitée.
476
John Carter

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

96
duskwuff

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 de l'article" ... 
 .. 
34
Wichert Akkerman

La commande printf imprimera les chaînes complètes:

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

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 voulez déboguer par leurs valeurs

17
abstraktor

Utiliser set elements ... n'est pas toujours le meilleur moyen. Il serait utile qu’il y ait un set string-elements ... distinct.

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 est dépendant de c ++ lib car il accède aux membres de std :: string, mais est facilement ajustable.
  • Le second ne peut être utilisé que sur un programme en cours car il appelle strlen.
1
mrtimdog