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]

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top