Comment puis-je imprimer la valeur complète d’une chaîne longue dans gdb?

Je veux imprimer toute la longueur d’une chaîne de caractères dans GDB. Par défaut, il est abrégé, comment puis-je forcer GDB à imprimer la chaîne complète?

set print elements 0 

Du manuel GDB :

set print elements number-of-elements set print elements

Définissez une limite pour le nombre d’éléments d’un tableau GDB à imprimer. Si GDB imprime un grand tableau, il cesse 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. Lorsque GDB démarre, cette limite est définie sur 200. Définir le nombre d’éléments sur zéro signifie que l’impression est illimitée .

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

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_ssortingng . La sortie pourrait ê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" ...
 ..

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

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

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 par leurs valeurs

Utiliser des set elements ... n’est pas toujours le meilleur moyen. Ce serait utile s’il y avait un set ssortingng-elements ... distinct d’ set ssortingng-elements ...

Donc, j’utilise ces fonctions dans mon fichier .gdbinit:

 define pstr ptype $arg0._M_dataplus._M_p printf "[%d] = %s\n", $arg0._M_ssortingng_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 :: ssortingng, mais s’ajuste facilement.
  • Le second ne peut être utilisé que sur un programme en cours d’exécution, comme il appelle strlen.