Verwirrt von GDB Druck ptr vs print „% s“
-
09-06-2019 - |
Frage
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
Warum ist die Zeichenfolge richtig ptr Druck aber cwd nicht; Dies wirkt sich auch auf das Programm und es stürzt ab, wenn ich versuche, die cwd zu verwenden ...
[edit: stellt sich heraus, dass Crash durch einen dummen Pufferüberlauf auf dieser var verursacht wurde ... grr ... nicht gdb, aber die Druck Frage war noch gültig]
Lösung
Der Grund, dass cwd
anders in gdb
gedruckt wird, ist, weil gdb
weiß, dass ptr
ein char *
ist (glaube ich) und dass cwd
ist ein Array mit der Länge 3500
(wie in der Ausgabe dargestellt). Also, wenn ptr
Drucken druckt den Zeigerwert (und als Service auch die Zeichenfolge verweist er auf) und beim Drucken cwd
druckt die ganze Array.
Ich sehe keinen Grund, warum die Probleme mit cwd
statt ptr
führen würde, aber ich müsste etwas Code, um zu sehen sicher sein.
Andere Tipps
Ich bin mit mweerden. Der Versuch, etwas, was ich glaube, um Ihren Code ähnlich ist, erhalte ich:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
von GDB, so scheint es, dass seit cwd
als char cwd[3500]
definiert wurde, gdb das gesamte Array druckt, während, wenn Sie gdb sagen es als char*
zu interpretieren, es wird funktionieren wie erwartet. Wenn Ihre Anwendung abstürzt, würde davon ausgehen, ich es wegen etwas anderem.
Die ptr
angezeigt wird, wie schön formatierte Zeichenfolge und cwd
als „Byte-Puffer“ ist wahrscheinlich spezifisch für GDB. Auf jeden Fall sollte es nicht Ihre Anwendung auswirken; nach man 3 getcwd
sollte ptr
cwd
Punkt (oder es sollte NULL sein, wenn ein Fehler aufgetreten ist).
Können Sie ptr
ohne Absturz das Programm verwenden?
Welche Art ist cwd? Der obige Code-Schnipsel sagt uns nicht, dass. Es könnte sein, dass ein Hohlraum ptr sein * unterschiedlich von GDB behandelt.