annotate dbg/CallStackInfo.d @ 70:6bdecc3f4569

Get rid of win32 bindings
author korDen
date Sat, 28 Aug 2010 10:51:32 +0400
parents
children ef02e2e203c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
1 /**
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
2 A simple runtime crash handler which collects various informations about
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
3 the crash such as registers, stack traces, and loaded modules.
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
4
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
5 TODO:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
6 * Threading support
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
7 * Stack dumps
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
8
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
9 Authors:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
10 Jeremie Pelletier
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
11
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
12 License:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
13 Public Domain
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
14 */
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
15 module dbg.CallStackInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
16
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
17 import dbg.Debug;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
18 import dbg.image.PE;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
19
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
20 import core.stdc.stdio;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
21 import core.sys.windows.windows;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
22
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
23 class CallStackInfo
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
24 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
25 this(EXCEPTION_POINTERS* e = null)
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
26 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
27 size_t[16] buff;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
28 size_t[] backtrace = buff[];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
29 size_t numTraces = 0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
30
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
31 bool skipFirst = false;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
32
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
33 size_t ip = void, bp = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
34 if (e !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
35 ip = e.ContextRecord.Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
36 bp = e.ContextRecord.Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
37
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
38 error = _d_translate_se_to_d_exception(e.ExceptionRecord);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
39 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
40 } else {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
41 asm {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
42 mov bp, EBP;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
43 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
44 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
45
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
46 while (true) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
47 ip = cast(size_t)*(cast(void**)bp + 1);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
48 if (ip == 0) break;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
49
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
50 append(backtrace, numTraces, ip);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
51
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
52 bp = cast(size_t)*cast(void**)bp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
53 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
54
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
55 frames = new StackFrameInfo[numTraces];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
56 ResolveStackFrames(backtrace[0..numTraces], frames);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
57 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
58
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
59 Throwable error;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
60 StackFrameInfo[] frames;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
61
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
62 string toString() {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
63 string text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
64
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
65 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
66 text ~= error.toString() ~ "\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
67 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
68
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
69 text ~= "Stack trace:\n------------------\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
70 char buffer[128];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
71 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
72 with(frame.fileLine) if(line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
73 auto len = snprintf(buffer.ptr, buffer.length, "%u", line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
74 text ~= file ~ ":" ~ buffer[0 .. len] ~ "\r\n";
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
75 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
76 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
77
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
78 text ~= '\0';
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
79
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
80 return text;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
81 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
82
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
83 void dump() {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
84 if (error !is null) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
85 printf("%.*s\n", error.toString());
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
86 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
87
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
88 printf("Stack trace:\n------------------\n");
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
89 foreach(ref frame; frames) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
90 with(frame.fileLine) if (line) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
91 printf("%.*s:%d\r\n", file, line);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
92 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
93 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
94 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
95
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
96 private:
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
97
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
98 struct StackFrameInfo {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
99 size_t va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
100 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
101 SymbolInfo symbol;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
102 FileLineInfo fileLine;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
103 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
104
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
105 struct DebugImage {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
106 DebugImage* next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
107 string moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
108 size_t baseAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
109 uint rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
110 IExecutableImage exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
111 ISymbolicDebugInfo debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
112 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
113
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
114 void ResolveStackFrames(size_t[] backtrace, StackFrameInfo[] frames) const {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
115 StackFrameInfo* frame = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
116 DebugImage* imageList, image = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
117 char[255] buffer = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
118 uint len = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
119 uint rva = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
120
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
121 version(Windows) MEMORY_BASIC_INFORMATION mbi = void;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
122
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
123 foreach(i, va; backtrace) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
124 frame = &frames[i];
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
125 frame.va = va;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
126
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
127 // mbi.Allocation base is the handle to stack frame's module
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
128 VirtualQuery(cast(void*)va, &mbi, MEMORY_BASIC_INFORMATION.sizeof);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
129 if(!mbi.AllocationBase) break;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
130
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
131 image = imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
132 while(image) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
133 if(image.baseAddress == cast(size_t)mbi.AllocationBase) break;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
134 image = image.next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
135 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
136
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
137 if(!image) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
138 image = new DebugImage;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
139
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
140 with(*image) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
141 next = imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
142 imageList = image;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
143 baseAddress = cast(size_t)mbi.AllocationBase;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
144
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
145 len = GetModuleFileNameA(cast(HMODULE)baseAddress, buffer.ptr, buffer.length);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
146 moduleName = buffer[0 .. len].idup;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
147 if (len != 0) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
148 exeModule = new PEImage(moduleName);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
149 rvaOffset = baseAddress + exeModule.codeOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
150 debugInfo = exeModule.debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
151 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
152 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
153 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
154
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
155 frame.moduleName = image.moduleName;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
156
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
157 if(!image.debugInfo) continue;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
158
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
159 rva = va - image.rvaOffset;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
160
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
161 with(image.debugInfo) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
162 frame.symbol = ResolveSymbol(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
163 frame.fileLine = ResolveFileLine(rva);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
164 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
165 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
166
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
167 while(imageList) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
168 image = imageList.next;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
169 delete imageList.debugInfo;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
170 delete imageList.exeModule;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
171 delete imageList;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
172 imageList = image;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
173 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
174 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
175 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
176
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
177 void CrashHandlerInit() {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
178 //SetErrorMode(SetErrorMode(0) | SEM_FAILCRITICALERRORS);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
179 SetErrorMode(0);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
180 SetUnhandledExceptionFilter(&UnhandledExceptionHandler);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
181 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
182
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
183 enum EXCEPTION_EXECUTE_HANDLER = 1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
184
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
185 extern(Windows) int UnhandledExceptionHandler(EXCEPTION_POINTERS* e) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
186 scope CallStackInfo info = new CallStackInfo(e);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
187 info.dump();
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
188
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
189 return EXCEPTION_EXECUTE_HANDLER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
190 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
191
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
192 extern (Windows) extern UINT SetErrorMode(UINT);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
193 alias LONG function(EXCEPTION_POINTERS*) PTOP_LEVEL_EXCEPTION_FILTER;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
194 extern (Windows) PTOP_LEVEL_EXCEPTION_FILTER SetUnhandledExceptionFilter(PTOP_LEVEL_EXCEPTION_FILTER);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
195
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
196 void append(T)(T[] array, ref size_t index, T value)
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
197 {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
198 size_t capacity = array.length;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
199 assert(capacity >= index);
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
200 if (capacity == index) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
201 if (capacity < 8) {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
202 capacity = 8;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
203 } else {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
204 array.length = capacity * 2;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
205 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
206 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
207
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
208 array[index++] = value;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
209 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
210
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
211 struct EXCEPTION_POINTERS {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
212 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
213 CONTEXT* ContextRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
214 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
215
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
216 const size_t EXCEPTION_MAXIMUM_PARAMETERS = 15;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
217
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
218 struct EXCEPTION_RECORD {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
219 DWORD ExceptionCode;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
220 DWORD ExceptionFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
221 EXCEPTION_RECORD* ExceptionRecord;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
222 PVOID ExceptionAddress;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
223 DWORD NumberParameters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
224 DWORD[EXCEPTION_MAXIMUM_PARAMETERS] ExceptionInformation;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
225 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
226
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
227 const MAXIMUM_SUPPORTED_EXTENSION = 512;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
228
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
229 struct CONTEXT {
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
230 DWORD ContextFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
231 DWORD Dr0;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
232 DWORD Dr1;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
233 DWORD Dr2;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
234 DWORD Dr3;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
235 DWORD Dr6;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
236 DWORD Dr7;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
237 FLOATING_SAVE_AREA FloatSave;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
238 DWORD SegGs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
239 DWORD SegFs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
240 DWORD SegEs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
241 DWORD SegDs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
242 DWORD Edi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
243 DWORD Esi;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
244 DWORD Ebx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
245 DWORD Edx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
246 DWORD Ecx;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
247 DWORD Eax;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
248 DWORD Ebp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
249 DWORD Eip;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
250 DWORD SegCs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
251 DWORD EFlags;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
252 DWORD Esp;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
253 DWORD SegSs;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
254 BYTE[MAXIMUM_SUPPORTED_EXTENSION] ExtendedRegisters;
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
255 }
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
256
6bdecc3f4569 Get rid of win32 bindings
korDen
parents:
diff changeset
257 extern(C) Throwable _d_translate_se_to_d_exception(EXCEPTION_RECORD* exception_record);