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?
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?
Réponses:
set print elements 0
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 elements
commande. 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 .
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.
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" ... ..
x
!
La printf
commande affichera les chaînes complètes:
(gdb) printf "%s\n", string
set print elements nnn
limite et n'imprimera pas la chaîne complète à moins que vous ne le fassiez set print elements 0
.
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
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: