2012-05-06 11 views
5

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 ...

Antwort

2

Normalerweise verwende ich die Segmentregisterwerte für meinen Schlüssel, um Kontextdatensätze zu finden (ES und DS haben den gleichen Wert und sind nebeneinander in der CONTEXT-Struktur). Der Flaggentrick ist aber auch ordentlich.

eine Ausnahme in einer Testanwendung erzwingt dann vom Stapel der Kontext Satzstruktur zu graben, sieht aus wie der magische Wert in meinem Fall 0x10001f würde:

0:000> dt ntdll!_context 000df1d0 
... 
    +0x030 ContextFlags  : 0x10001f 
... 
    +0x03a SegDs   : 0x2b 
    +0x03c SegEs   : 0x2b 
... 

Beachten Sie auch, dass der Context Wert nicht an das ist Anfang der Struktur, wenn Sie also diesen Wert finden, müssen Sie @@ C++ (# FIELD_OFFSET (ntdll! _CONTEXT, ContextFlags)) davon abziehen, um die Basis der Kontextstruktur zu erhalten.

Auch, wenn es nicht offensichtlich war, kommt dieser Wert von einer Stichprobengröße von genau einem. Es ist möglicherweise nicht korrekt in Ihrer Umgebung und es unterliegt natürlich Änderungen (wie etwas Implementierungsspezifischen wie diese).

+0

das scheint zu funktionieren, aber was ist der Offset zurück an den Anfang der Struktur? Ich konnte meinen Stack noch nicht bekommen. –

+0

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