Confus par gdb print ptr vs print "%s"
-
09-06-2019 - |
Question
1167 ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168 if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
Pourquoi ptr imprime-t-il correctement la chaîne mais pas cwd ?cela affecte également le programme et il plante si j'essaie d'utiliser le cwd...
[modifier:il s'avère que le crash a été causé par un stupide débordement de tampon sur cette variable...grr...pas gdb, mais la question imprimée était toujours valable]
La solution
La raison pour laquelle cwd
est imprimé différemment dans gdb
c'est parce que gdb
sait que ptr
est un char *
(je suppose) et ça cwd
est un tableau de longueur 3500
(comme indiqué dans votre sortie).Alors lors de l'impression ptr
il imprime la valeur du pointeur (et en tant que service également la chaîne vers laquelle il pointe) et lors de l'impression cwd
il imprime le entier tableau.
Je ne vois aucune raison d'utiliser cwd
au lieu de ptr
cela entraînerait des problèmes, mais j'aurais besoin de voir du code pour en être sûr.
Autres conseils
Je suis d'accord avec Mweerden.En essayant quelque chose qui me semble similaire à votre code, j'obtiens :
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
de gdb, il semble donc que depuis cwd
a été défini comme char cwd[3500]
, gdb imprime l'intégralité du tableau, tandis que si vous dites à gdb de l'interpréter comme un char*
, cela fonctionnera comme prévu.Si votre application plante, je suppose que c'est à cause d'autre chose.
Que ptr
est affiché sous forme de chaîne bien formatée et cwd
car "byte buffer" est probablement spécifique à gdb.Dans tous les cas, cela ne devrait pas affecter votre candidature ;selon man 3 getcwd
, ptr
devrait pointer vers cwd
(ou il devrait être NULL si une erreur s'est produite).Peux tu utiliser ptr
sans planter le programme ?
De quel type est le cwd ?L'extrait de code ci-dessus ne nous le dit pas.Il se pourrait que ptr étant un void* soit traité différemment par gdb.