Pregunta

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

¿Por qué ptr imprime la cadena correctamente pero cwd no?esto también afecta al programa y falla si intento usar el cwd...

[editar:Resulta que el bloqueo fue causado por un estúpido desbordamiento del búfer en esta var...grr...no gdb, pero la pregunta impresa aún era válida]

¿Fue útil?

Solución

La razón que cwd se imprime de forma diferente en gdb es porque gdb saber eso ptr es un char * (supongo) y eso cwd es una matriz de longitud 3500 (como se muestra en su salida).Entonces al imprimir ptr imprime el valor del puntero (y como servicio también la cadena a la que apunta) y al imprimir cwd imprime el entero formación.

No veo ninguna razón por la cual usar cwd en lugar de ptr generaría problemas, pero necesitaría ver algún código para estar seguro.

Otros consejos

Estoy de acuerdo con mweerden.Al intentar algo que creo que es similar a su código, obtengo:

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

de gdb, por lo que parece que desde cwd fue definido como char cwd[3500], gdb imprime la matriz completa, mientras que si le dice a gdb que la interprete como un char*, funcionará como esperas.Si su aplicación falla, supongo que se debe a otra cosa.

Eso ptr se muestra como una cadena con un formato agradable y cwd como "búfer de bytes" probablemente sea específico de gdb.En cualquier caso, no debería afectar su aplicación;de acuerdo a man 3 getcwd, ptr debería señalar a cwd (o debería ser NULL si ocurrió un error).Puedes usar ptr sin bloquear el programa?

¿Qué tipo es cwd?El fragmento de código anterior no nos dice eso.Podría ser que ptr, al ser un void*, sea tratado de manera diferente por gdb.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top