Confuso da gdb print ptr vs print “%s”
-
09-06-2019 - |
Domanda
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
Perché ptr stampa la stringa correttamente ma cwd no;anche questo influisce sul programma e si blocca se provo a usare il cwd...
[modificare:risulta che l'arresto anomalo è stato causato da uno stupido overflow del buffer su questa var...grr...non gdb, ma la domanda print era ancora valida]
Soluzione
Il motivo è quello cwd
è stampato diversamente in gdb
è perché gdb
lo sa ptr
è un char *
(immagino) e quello cwd
è un array di lunghezza 3500
(come mostrato nel tuo output).Quindi durante la stampa ptr
stampa il valore del puntatore (e come servizio anche la stringa a cui punta) e durante la stampa cwd
stampa il Totale vettore.
Non vedo alcun motivo per cui utilizzarlo cwd
invece di ptr
porterebbe a problemi, ma avrei bisogno di vedere del codice per essere sicuro.
Altri suggerimenti
Sono d'accordo con Mweerden.Provando qualcosa che credo sia simile al tuo codice, ottengo:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
da gdb, quindi sembra che da allora cwd
è stato definito come char cwd[3500]
, gdb stampa l'intero array, mentre se dici a gdb di interpretarlo come a char*
, funzionerà come previsto.Se la tua applicazione si blocca, presumo che sia a causa di qualcos'altro.
Quello ptr
viene visualizzato come stringa ben formattata e cwd
poiché "byte buffer" è probabilmente specifico di gdb.In ogni caso non dovrebbe influenzare la tua candidatura;secondo man 3 getcwd
, ptr
dovrebbe indicare cwd
(o dovrebbe essere NULL se si è verificato un errore).Puoi usare ptr
senza mandare in crash il programma?
Che tipo è CWD?Lo snippet di codice sopra non ce lo dice.Potrebbe darsi che essendo ptr un void* venga trattato diversamente da gdb.