Confundido por gdb print ptr vs print “%s”
-
09-06-2019 - |
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]
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.