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]

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top