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]

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top