Ich habe WinDbg verwendet, um Dump-Dateien für eine Weile jetzt zu debuggen.
Es gibt einen netten "Trick", der mit x86 nativen Programmen funktioniert, Sie können den Stapel nach den CONTEXT_ALL
Flags durchsuchen (0x1003f).Wie finde ich native Ausnahmen in einem x64-Stack?
In x64 die CONTEXT_ALL
Flaggen offenbar nicht enthalten 0x1003f ...
Nun das Problem ist, dass manchmal, wenn Sie mit verwaltetem Code nativen mischen, die regulären Methoden der Ausnahmen zu finden (wie .exc oder. letzte Veranstaltung).
Was ist das Äquivalent von 0x1003f in x64? Gibt es so eine Konstante?
EDIT:
BTW, wenn Sie sich fragen, in der Theorie sollte es 10003f wegen der Definitionen haben:
#define CONTEXT_I386 0x00010000
#define CONTEXT_AMD64 0x00100000
#define CONTEXT_CONTROL 0x00000001L // SS:SP, CS:IP, FLAGS, BP
#define CONTEXT_INTEGER 0x00000002L // AX, BX, CX, DX, SI, DI
#define CONTEXT_SEGMENTS 0x00000004L // DS, ES, FS, GS
#define CONTEXT_FLOATING_POINT 0x00000008L // 387 state
#define CONTEXT_DEBUG_REGISTERS 0x00000010L // DB 0-3,6,7
#define CONTEXT_EXTENDED_REGISTERS 0x00000020L // cpu specific extensions
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS)
#define CONTEXT_ALL (CONTEXT_FULL | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | CONTEXT_EXTENDED_REGISTERS)
#define CONTEXT_I386_FULL CONTEXT_I386 | CONTEXT_FULL
#define CONTEXT_I386_ALL CONTEXT_I386 | CONTEXT_ALL
#define CONTEXT_AMD64_FULL CONTEXT_AMD64 | CONTEXT_FULL
#define CONTEXT_AMD64_ALL CONTEXT_AMD64 | CONTEXT_ALL
Aber es ist nicht ...
das scheint zu funktionieren, aber was ist der Offset zurück an den Anfang der Struktur? Ich konnte meinen Stack noch nicht bekommen. –
Der Wert, nach dem Sie suchen, repräsentiert vermutlich das ContextFlags-Feld der _CONTEXT-Struktur. Wenn Sie den magischen Wert auf dem Stapel finden, zeigt die Stapelzeigeradresse auf die Adresse des ContextFlags-Felds der Struktur. Um die Basis der Struktur zu erhalten, müssen Sie daher den Offset des Feldes ContextFlags subtrahieren. – snoone