2008-09-12 6 views
1
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 la chaîne correctement mais pas cwd; cela affecte aussi le programme et il se bloque si j'essaie d'utiliser le cwd ...Confondu par gdb print ptr contre l'impression "% s"

[edit: il s'avère que le crash a été provoqué par un débordement stupide de tampon sur ce var ... grr ... pas gdb, mais la question d'impression était toujours valide]

+0

Quelqu'un se soucie de modifier le titre afin qu'il nous donne plus d'informations? Je n'ai pas le représentant pour le faire –

Répondre

2

La raison pour laquelle cwd est différemment imprimé en gdb est parce que gdb sait que ptr est un char * (je suppose) et que cwd est un tableau de longueur 3500 (comme indiqué dans la sortie). Ainsi, 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 tableau entier.

Je ne vois aucune raison pour laquelle utiliser cwd au lieu de ptr conduirait à des problèmes, mais je voudrais voir du code pour être sûr.

1

Cette ptr est affichée sous la forme d'une chaîne joliment formatée et cwd en tant que "tampon d'octets" est probablement spécifique à gdb. En tout cas, cela ne devrait pas affecter votre application. selon man 3 getcwd, ptr devrait pointer vers cwd (ou il devrait être NULL si une erreur est survenue). Pouvez-vous utiliser ptr sans planter le programme?

0

Quel type est cwd? L'extrait de code ci-dessus ne nous le dit pas. Il se pourrait que ptr étant un void * est traité différemment par gdb.

5

Je suis d'accord avec mweerden. Essayer quelque chose que je crois est similaire à votre code, je reçois:

(gdb) print cwd 
$1 = "/media", '\0' <repeats 782 times>, "\016���" ... 
(gdb) print (char*) cwd 
$2 = 0xbfc8eb84 "/media" 

de gdb, il semble que depuis cwd a été définie comme char cwd[3500], gdb imprime le tableau entier, alors que si vous dites gdb de l'interpréter comme char*, cela fonctionnera comme prévu. Si votre application plante, je suppose que c'est à cause d'autre chose.

Questions connexes